# Subscript

subscript는 아주 익숙한 친구인데, 키워드명 자체로는 도무지 뭐의 서브를 가르키는지는 잘 모를 수 있다.

```javascript
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를 마치 함수처럼 호출해서 받고자 하는 스크립트 타입과 반환 받고자 하는 타입으로 정의해주면 된다. 그러면 `[ 스크립트 ]` 형식으로 인스턴스에서 접근할 수 있다.

```javascript
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를 지정해줄 수 있다. 이럴경우 [ ] 형식으로 접근하는 것이 아닌, `.`으로 값에 접근할 수 있다. (굳이굳이 이렇게 할 수 있다.)

```javascript
@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)
```

For the site tree, see the [root Markdown](https://slashpage.com/hankyeol.md).
