Swift Subscript 문법

  • 클래스, 구조체, 열거형에는 컬렉션, 리스트, 시퀀스 등 타입의 요소에 접근하는 단축 문법인 Subscript를 정의할 수 있다.
  • Subscript는 별도의 설정자(Setter) 또는 접근자(Getter) 등의 메서드를 구현하지 않아도 인덱스를 통해 값을 설정하거나 가져올 수 있다.

    예를 들어, tmpArray라는 Array 인스턴스의 index를 통해 해당 인덱스의 값에 접근할 때는 tmpArray[index]라고 표현한다. tmpDictionary라는 Dictionary의 key를 통해 해당 키의 값을 가져올 때는 tmpDictionary[key]로 표현한다.

  • 한 타입에 여러 개의 Subscript를 정의할 수 있고, 다른 타입을 인덱스로 갖는 여러 개의 Subscript를 중복 정의(overload)할 수도 있다.

Subscript 문법

  • Subscript는 인스턴스의 이름 뒤에 대괄호로 감싼 값을 써줌으로써 인스턴스 내부의 특정값에 접근할 수 있다.
  • Subscript는 subscript 키워드를 사용하여 정의한다.
  • 인스턴스 메서드와 비슷하게 매개변수의 개수, 타입, 반환 타입 등을 지정하며, 읽고 쓰기가 가능하도록 구현하거나 읽기 전용으로만 구현할 수 있다.
  • Subscript를 정의하는 코드는 각 타입의 구현부 또는 타입의 extension 구현부에 위치해야 한다.
subscript(index: Int) -> Int {
  get {
    // 적절한 Subscript 결괏값 반환
  }
  
  set(newValue) {
    // 적절한 설정자 역할 수행
  }
}

위 코드의 Subscript 설정자의 newValue의 타입은 Subscript의 반환 타입과 동일하다.

// 읽기 전용 Subscript
subscript(index: Int) -> Int {
  get {
    // 적절한 Subscript 값 반환
  }
}

subscript(index: Int) -> Int {
  // 적절한 Subscript 결괏값 반환
}

읽기 전용 Subscript를 구현할 때는 get이나 set 키워드를 사용하지 않고 적절한 값만 반환해주는 형태로 구현해도 된다.

여러 개의 Subscript

  • 하나의 타입이 여러 개의 Subscript를 가질 수도 있다.
  • 다양한 매개변수 타입을 사용하여 Subscript를 구현하면 여러 용도로 Subscript를 사용할 수 있다.
class Hello {
    var _name: String
    
    init(name: String) {
        self._name = name
    }
    
    subscript(msg: String) -> String {
        return "(_name)님, (msg)"
    }
    
    subscript(a: Int, b: Int) -> Int {
        return a * b
    }
}

var hello = Hello(name: "Hyowon")
print(e["안녕하세요"])
print(e[100,7])

Choi Hyowon

열심히 공부 중 입니다.