Subscript 는 컬랙션, 리스트 또는 시퀀스의 요소에 접근할 수 있는 방법을 제공합니다
Subscript란
Subscript는 어려운 것이 아닙니다. 평소에 특정 배열 요소에 접근하기 위해서 사용하던 [] 이 바로 subscript 입니다.
클래스, 구조체, 열거형은 서브스크립트를 정의하여 index를 통해 해당하는 element에 접근하고 값을 설정하거나 검색할 수 있습니다.
예를 들어, 배열(Array)에서는 array[index], 딕셔너리(Dictionary)에서는 dictionary[key]와 같이 값을 가져올 수 있습니다.
subscript를 사용하면 특정 값을 가져오거나 설정할 수 있습니다.
subscript(index: Int) -> Int {
get {
// Return an appropriate subscript value here.
}
set(newValue) {
// Perform a suitable setting action here.
}
}
Subscript의 정의
subscript는 여러 컬랙션, 리스트 또는 시퀀스의 요소에 접근할 수 있는 방법을 제공하는데 다음 예시를 보면서 확인해보겠습니다.
Array 타입에서 subscript를 다음과 같이 정의하면
extension Array where Element == String {
subscript(value: String) -> Element? {
self.first(where: { $0 == value })
}
}
아래와 같은 데이터에서 1번째 데이터에 접근하기 위해서는 보통은
var myArray: [String] = ["one", "two", "three"]
아래와 같은 방식처럼 접근합니다.
myArray[0]
하지만 위에서 정의한 subscript 를 사용하게 된다면 아래처럼 사용할 수 있게 됩니다.
myArray["one"]
또 다른 예시를 들어보겠습니다.
다음은 TimesTable 이라는 구조체의 multiplier라는 변수가 들어있습니다. 이때 multiplier의 값이 3인 TimesTable의 인스턴스를 만든 코드입니다. print 문에서는 threeTimesTable[6] 으로 구조체에서 정의한 subscript를 사용하여 3*6이라는 값을 출력받게 되어 18이 출력되게 됩니다.
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// Prints "six times three is 18"
Subscript를 사용하는 Dictionary
subscript를 사용하게 된다면 값을 가져오는 것 뿐만 아니라 값을 설정할 수도 있습니다. 아래 코드는 딕셔너리 타입은 subscript를 사용하여 값을 설정하다는 것을 보여주는 코드입니다.
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
타입 Subscript
타입 자체에서 호출되는 subscript도 정의할 수 있습니다. 이를 type subscript라고 하며, static 키워드를 사용하여 정의합니다.
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
static subscript(n: Int) -> Planet {
return Planet(rawValue: n)!
}
}
let mars = Planet[4]
print(mars) // 출력: mars
이 예제에서는 Planet enum에 type subscript를 정의하여, 정수 값을 사용해 특정 행성을 반환하는 코드입니다.
Subscript 장점
subscript는 코드의 가독성을 높여주고 컬렉션 element에 보다 간편하게 접근할 수 있게 해주는 기능으로 사용됩니다.
'SwiftUI' 카테고리의 다른 글
Class, ARC, Weak Self (0) | 2024.05.20 |
---|---|
Struct 구조체 (0) | 2024.05.18 |
async let 으로 비동기 작업들을 동시에 수행하기 (1) (0) | 2024.05.17 |
Chat GPT API 사용하기 (3) | 2024.05.15 |
공공 데이터 지도에 띄우기 (with 네이버 지도) (0) | 2024.05.13 |