<aside> 💡 클래스, 구조체 그리고 열거형에서 스크립트를 정의해 사용할 수 있습니다. 서브스크립트란 콜렉션, 리스트, 시퀀스 등 집합의 특정 멤버 엘리먼트에 간단하게 접근할 수 있는 문법입니다. 서브스크립트를 이용하면 추가적인 메소드 없이 특정 값을 할당(assign)하거나 가져올 수(retrieve) 있습니다. 예를들면, 배열(Array) 인스턴스의 특정 엘리먼트는 someArray[index]문법으로, 사전(Dictionary) 인스턴스의 특정 엘리먼트는 someDictionary[key]로 접근할 수 있습니다. 하나의 타입에 여러 서브스크립트를 정의할 수 있고 오버로드(Overload)도 가능합니다. 뿐만아니라 단일 인자 값을 넘어, 필요 따라 복수 인자 값을 사용할 수 있습니다.****

</aside>

Subscript Syntax(서브스크립트 문법)

<aside> 💡 서브스크립트 선언 문법은 인스턴스 메소드와 계산된 프로퍼티를 선언하는 것과 비슷합니다. 인스턴스 메소드와 다른 점은, 서브스크립트는 읽고-쓰기(read-write) 혹은 읽기 전용(read only)만 가능하다는 것입니다. 정의는 계산된 프로퍼티 방식과 같이 setter, getter 방식을 따릅니다.

</aside>

subscript(index: Int) -> Int {
    get {
        // 적절한 반환 값
    }
    set(newValue) {
        // 적절한 set 액션
    }
}

<aside> 💡 서브스크립트의 set에 대한 인자 값을 따로 지정하지 않으면 기본 값(default value)로 newValue를 사용합니다. 읽기 전용으로 선언하려면 get, set을 지우고 따로 지정하지 않으면 get으로 동작하게 되서 읽기 전용으로 선언됩니다.1

</aside>

subscript(index: Int) -> Int {
    // 적절한 반환 값
}
//읽기 전용으로 선언한 서브스크립트의 (예)
struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \\(threeTimesTable[6])")
// "six times three is 18" 출력

Subscript Usage(서브스크립트 사용)

var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2

numberOfLegs 값은 타입 추론에 의해 [String: Int] 형을 갖습니다.

numberOfLegs[”bird”] = 2 는 딕셔너리 변수 numberOfLegs 에 key 로 bird를 그 값은 2를 넣으라는 서브스크립트 문법입니다.

<aside> 💡 딕셔너리의 반환 값은 옵셔널입니다. 그 이유는 딕셔너리에 특정 키 값이 없는 경우가 있을 수 있고, 특정 키 값을 nil로 설정할 수 있기 때문입니다.

</aside>

Subscript Options (서브스크립트 옵션)

서브스크립트는 입력 인자의 숫자에 제한이 없고. 입력 인자의 타입과 반환 타입의 제한도 없다. 다만 in-out parameter나 기본 인자 값(default parameter value)을 제공할 수 없습니다. 서브스크립트는 overroading 허용. 그래서 인자형,반환형에 따라 원하는 수만큼 서브스크립트를 선언이 가능하다