티스토리 뷰

Mobile/iOS

Swift. @dynamicMemberLookup

out of coding 2021. 1. 3. 15:39

swift의 dynamicMemberLookup에 대해서 알아볼까 합니다.

4.2에서 만들어진 녀석인데요.

 

Dictionary 형태의 값을 가지고 subscript(dynamicMember:)를 가지고 값을 마치 property 처럼 사용이 가능하도록 한 겁니다.

 

다음과 같은 형태로 만들수 있어요.

@dynamicMemberLookup
struct PropertyDictionary {
    private let properties: [String: Any]
    
    init(_ dictionary: [String: Any]) {
        properties = dictionary
    }

    subscript(dynamicMember string: String) -> Any? {
        return properties[string]
    }
}

자 이렇게 만들어 두면 사용하는 쪽에서는?

let dictionary: [String: Any] = [
    "abc": 1, "a": "abc"
]

let property = PropertyDictionary(dictionary)
print("test:", property.a ?? "aaa")

그냥 이렇게 파싱해서 사용한것처럼 사용이 가능합니다.

코드는 아래에도 올려두었어요

 

github.com/outofcode-example/iOS-PropertyDictionary

 

outofcode-example/iOS-PropertyDictionary

Using dictionary a like property. Contribute to outofcode-example/iOS-PropertyDictionary development by creating an account on GitHub.

github.com

그런데 Swift 5.1에서 추가가 되었습니다.

@dynamicMemberLookup
struct PersonWrapper<T> {
    private let primate: T
    
    init(_ primate: T) {
        self.primate = primate
    }
    
    subscript<U>(dynamicMember keyPath: WritableKeyPath<T, U>) -> U {
        return primate[keyPath: keyPath]
    }
}

struct Person {
    var name: String = "DH"
    var age: Int = 100
}

이렇게 접근이 가능합니다.

let person = PersonWrapper(Person())
print(person.name)

그렇네요 정말 Wrapping 하여서 사용하는 케이스 외에는 생각이 안나는데...

아무튼 알아두고 나중에 요긴하게 사용하렵니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함