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에 보다 간편하게 접근할 수 있게 해주는 기능으로 사용됩니다.

 

ytw_developer