배열, 딕셔너리, 열거형 등에서는 대괄호[ ]를 사용하여 원하는 결과값을 얻을 수 있습니다.
이러한 대괄호를 사용하여 원하는 값을 반환하는 문법을 서브스크립트(Subscripts)라 부르며, 개발자가 많이 사용하는 배열, 딕셔너리, 열거형 같은 경우는 특별한 서브스크립트 구현 없이 바로 사용할 수 있습니다. (애플에서 Swift 언어를 만들 때 내부적으로 기능을 미리 구현)
하지만 특별한 기능 또는 인스턴스가 직접 접근하여 사용해야 할 때는 개발자가 서브스크립트를 구현하여 사용할 수 있습니다.
서브스크립트는 get만을 사용하여 읽기 전용(read only)으로 사용 가능하며, get과 set을 둘 다 사용하여 읽고/쓰기(read/write)용으로도 사용 가능합니다.
서브스크립트의 get/set의 정의 방법은 계산 속성(Computed Properties)과 매우 유사합니다.
✅ 읽기(get) 전용으로 만든 서브스크립트
class Man{ var classFriend = ["짱구", "철수", "훈이", "유리", "맹구"] subscript(index: Int) -> String{ return classFriend[index] } } var kim = Man() kim[2] //훈이
✅ 읽기(get)/쓰기(set)용으로 만든 서브스크립트
class Man{ var classFriend = ["짱구", "철수", "훈이", "유리", "맹구"] subscript(index: Int) -> String{ get{ return classFriend[index] } set{ classFriend[index] = newValue } } } var kim = Man() kim[2] //훈이 kim[2] = "사토 마사오" print(kim[2]) //사토 마사오
인스턴스가 아닌 클래스나 구조체, 열거형이 직접 접근하여 사용하는 서브스크립트입니다.
타입 서브스크립트 또한 get/set을 사용하여 "읽기 전용" 또는 "읽고/쓰기용"으로 만들 수 있습니다.
subscripts( ) 앞에 "static" 또는 "class" 키워드를 작성하여 사용합니다. (static으로 선언할 경우 상속 후 재정의가 불가능하다.)
enum Rainbow: Int{ case red = 1, orange, yellow, green, blue, navy, purple static subscript(index: Int) -> Rainbow{ get{ return Rainbow(rawValue: index)! } } } var color = Rainbow[4] print(color) //green
서브스크립트를 정의하는 방법은 함수를 정의하는 방법과 매우 유사합니다. 그 이유는 서브스크립트가 함수이기 때문입니다.
서브스크립트는 "func"키워드 대신 "Subscrips"키워드를 사용하며, 아규먼트 레이블(argument label)을 따로 사용하지 않는다는 특징을 가지고 있습니다.
서브스크립트는 클래스 또는 구조체, 열거형에서 사용하는 함수이기 때문에 메서드의 한 종류입니다.
참고자료: 앨런 Swift문법 마스터 스쿨