Subscript

Created by
  • 한결
subscript는 아주 익숙한 친구인데, 키워드명 자체로는 도무지 뭐의 서브를 가르키는지는 잘 모를 수 있다.
let dic: Dictionary<String, Int> = ["key1": 0, "key2": 1] dic["key1"] // 0 let arr: Array<String> = ["value1", "value2"] arr[0] // "value1"
딕셔너리, 배열과 같은 자료형에서 특정 키의 값을 조회하거나 특정 인덱스의 값을 조회할 때, [key], [index] 형태로 접근하게 도와주는 것이 서브스크립트다. 딕셔너리, 배열 내부에 서브스크립트 방식으로 값을 조회하는 코드가 구현되어 있어서 해당 방식으로 값에 접근할 수 있는 것이다.
서브스크립트는 struct, class와 같은 곳에서 커스텀해서 사용할 수도 있다. subscript를 마치 함수처럼 호출해서 받고자 하는 스크립트 타입과 반환 받고자 하는 타입으로 정의해주면 된다. 그러면 [ 스크립트 ] 형식으로 인스턴스에서 접근할 수 있다.
struct Member { var id: Int var name: String subscript(script: String) -> Result<String, Error> { return script == "id" ? .success(String(id)) : .failure(NSError(domain: "no exact data", code: 1)) } } let member1 = Member(id: 129012, name: "member1") member1["id"] // .success(129012) member1["name"] // .failure(NSError)
@dynamicMemberLookup 을 통해 subscript 선언부에 dynamicMember를 지정해줄 수 있다. 이럴경우 [ ] 형식으로 접근하는 것이 아닌, .으로 값에 접근할 수 있다. (굳이굳이 이렇게 할 수 있다.)
@dynamicMemberLookup struct Member { var id: Int var name: String subscript(dynamicMember script: String) -> Result<String, Error> { return script == "ids" ? .success(String(id)) : .failure(NSError(domain: "no exact data", code: 1)) } } let member1 = Member(id: 129012, name: "member1") member1.ids // .success(129012) member1.names // .failure(NSError)