Swift

[Swift] @dynamicMemberLookup 써보기

insub4067 2023. 10. 26. 16:06

 

 

GitHub - insub4067/Hello--dynamicMemberLookup

Contribute to insub4067/Hello--dynamicMemberLookup development by creating an account on GitHub.

github.com

@dynamicMemberLookup
struct Model {
    
    var items: [String: String]
    
    subscript(dynamicMember key: String) -> String? {
        items[key]
    }
}

struct Parent {
    let id: Int
    let name: String
}

@dynamicMemberLookup
struct Child {
    
    let name: String
    let parent: Parent
    subscript<T>(dynamicMember keyPath: KeyPath<Parent, T>) -> T {
        parent[keyPath: keyPath]
    }
}
let model = Model(items: ["one": "1", "two": "2"])
let child = Child(name: "child", parent: .init(id: 0, name: "parent"))

func onAppear() {
    print(model.one) // Optional("1")
    print(model.two) // Optional("2")

    print(child.id) // 0 
    print(child.name) // child
}

만약 같은 이름의 property 가 이미 존재한다면 subscript 으로 빠지지 않고 해당 인스턴스의 property 값을 뱉는다.