관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] @dynamicMemberLookup 이해하기, subscript(dynamicMember key: String) -> String 본문

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)하게끔 인터페이스를 구현해놓은 것

https://github.com/apple/swift-foundation/blob/9649a9817125730b567e2357f5bed38f5cdc7622/Sources/FoundationEssentials/AttributedString/AttributeContainer.swift#L19

 

* 참고

https://github.com/apple/swift-foundation/blob/9649a9817125730b567e2357f5bed38f5cdc7622/Sources/FoundationEssentials/AttributedString/AttributeContainer.swift#L19

Comments