21. DynamicMemberLookup

Cavok·2020년 10월 4일
0

* 정의

- DynamicMemberLookup 은 파이썬과의 호환성을 위해 도입된 문법이다.



먼저 구조체를 선언해보자

struct Car {
    var model: String
    var rpm: String
}
* 핵심은 특성이다. 구조체형식에 특성을 추가하고 싶다면 반드시 선언부에 @dynamicMemberLookup 를 명시 해주어야 한다.
@dynamicMemberLookup
struct Car {
    var model: String
    var rpm: String
}
* 그러나 여기서 끝나지 않았다. 만약에 형식에 특성을 추가하였다면 반드시 서브스크립트를 형식내부에 구현을 해야 한다. 그리고 하나의 String 타입 파라미터를 받고, 아규먼트레이블을 반드시 다이나믹멤버로 명시해야 한다. 하지만 반환되는 형식은 필요에 맞게 선언해도 된다.
@dynamicMemberLookup
struct Car {
    var model: String
    var rpm: String
    
    subscript(dynamicMember member: String) -> String {
        switch member { 
        case "modelKey":
            return model
        case "rpmKey":
            return rpm
        default:
            return "n/a"
        }
    }
}
* 이제 Car구조체는 다이나믹멤버룩업을 완벽하게 지원한다. 이제 인스턴스를 생성해보자
let c = Car(model: "k9", rpm: "6000")
c.model // k9
c.rpm  // 6000
* 이렇게 인스턴스 속성에 직접 접근하는 것도 가능하다.
c[dynamicMember: "modelKey"]  // k9
c[dynamicMember: "rpmKey"]  // 6000
* 서브스크립트에 직접 접근하는 것도 가능하다. 아규먼트레이블을 명시해주었기 때문에 아규먼트레이블로 접근을 하자.
* 현재 Car구조체는 DynamicMemberLookup을 완벽하게 지원을 하고 있다. 그래서 점문법으로 간단히 서브스크립트에 접근하는 것이 가능해졌다.
c.model // k9
c.rpm // 6000
* 이렇게 특성을 명시한 덕분에 코드의 유연성이 한결 높아졌다. 그러나 장점이 있으면 단점도 있기 마련, 대상에 접근하는 시점이 런타임이기 때문에 자동완성이 지원되지 않는다. 그래서 오타와 같은 실수를 유발할 수 있고, 유지보수에도 곤란을 겪을 수 있다.

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN