iOS 응용 (swift)
[iOS - swift] @dynamicMemberLookup 이해하기, subscript(dynamicMember key: String) -> String
jake-kim
2023. 8. 7. 01:44
@dynamicMemberLookup 개념
- 컴파일 타임에 정의하지 않은 property에 대한 접근을 런타임에 처리하도록 해주는 역할
- dynamic member lookup라고 명칭한 이유: 컴파일 타임이 아닌 런타임 기준으로(dynamic) 프로퍼티에 dot으로 접근(member lookup)한다는 의미
- 런타임에 접근하게 해주는데, 이 때는 dot으로 접근하게끔 하는 역할
- @dynamicMemberLookup을 선언하면 subscript(dynamicMember key: String) -> String 필수 구현이 필요
ex) Person이라는 구조체에 @dynamicMemberLookup을 사용
- 의미: Person이라는 프로퍼티에 접근할 때, 이 인스턴스를 사용하는 쪽에서 런타임에 생성되는 프로퍼티에 컴파일 에러 없이 접근이 가능하다는 의미
- yourName은 property가 아닌데 마치, 런타임 시점에(dynamic) property처럼 접근이 가능한 것(member lookup)
@dynamicMemberLookup
struct Person {
var name: String
subscript(dynamicMember key: String) -> String {
switch key {
case "yourName":
return name
default:
return "none"
}
}
}
var p = Person(name: "jake")
p.yourName // "jake"
- 동작 방식 이해하기
- 컴파일 타임에 정해진 프로퍼티가 아닌, 런타임에 동적으로 추가될 수 있는 값들을 문자열 형태가 아닌 마치 프로퍼티처럼 접근할 수 있는 방법은 @dynamicMember을 선언
- @dynamicMember을 선언하면 subscript(dynamicMember:String) 구현이 필요
- 외부에서 instance.abc라고 접근하면 subscript(dynamicMember:String)메소드 안으로 "abc"문자열이 들어오며 여기서 문자열을 비교하여 특정 값을 리턴해주는 것
ex) 애플 Foundation의 AttributedString 구현에서 @dynamicMember 사용
- AttributeContainer를 @dynamicMember속성으로 적용하여 attributed key들을 런타임 시점에(dynamic) 마치 프로퍼티 처럼 dot으로 접근(member look up)하게끔 인터페이스를 구현해놓은 것

* 참고