맛동산이

Swift) DynamicMemberLookUp(feat. subscript) 정리 본문

앱/Swift

Swift) DynamicMemberLookUp(feat. subscript) 정리

진ddang 2024. 1. 1. 21:24

DynamicMemberLookUp은 동적으로 런타임시 정해지는 임의의 name에 대해 dot으로 접근 가능하도록 하는 어노테이션 이다.

Subscripts

subscript는 우리가 array나, dictionary 와같이 인덱스값이나, 키값으로 접근을 할수 있도록 하는 기능을 의미한다.

  • class, enum, struct 가 채택하고 있다.

이처럼 collection type은 subscript를 채택하고 있기 때문에 우리가 접근이 가능한것이다.

public protocol Collection: Sequence { 	... 	subscript(position: Index) -> Element { get }  } 

하지만 타입 안에서 만약 프로퍼티로 존재한다면, 상위객체에서는 바로 접근은 불가능하다 기본적으로

즉 다음과 같은 상황

struct People { 	var person: [String: String] } 이상태면, 원래   let people = People(person["name": "jin"]) people.person["name"] //"jin" 

이렇게 접근 해야한다.

만약 상위객체에서 접근하려고 하면 당빠 에러.

하지만 이것은 subscript를 내부에 정의하는것으로 해결 가능하다.

struct People {          var person: [String: String]          subscript(key: String) -> String? {         return self.person[key]     } }  let people = People(person: ["name": "jin"]) people["name"] //"jin" 

DynamicMemberLookUp

DynamicMemberLookUp을 사용하면 위의 subscript메소드를 dynamic memeber를 통해서 생성하게 프로토콜이 짜져있다.

코드를 보자면

@dynamicMemberLookup struct People {

var persons: [String: String]  subscript(dynamicMember key: String) -> String? {     return self.persons[key] } 

}

요렇게 하면, 위의 subscript와 동일하게 subscript를 통해서 멤버 변수에 key값으로 접근이 가능하다.

let people = People(person: ["name": "jin"]) people[dynamicMember: "name"] //"jin"

이것이 여전히 가능하다는 말이다.

Untitled.png

진짜는 여기부터

DynamicMemberLookUp을 사용하면 위의 키값을 넣는것을 dot syntax를 사용할수 있게 된다.

Untitled.png

근데 이렇게 하면 nil값이 들어와도 결국 문제 없이 동작하는것 아닌가? 동일한게 아닌가 하는분이 있을것이다.

여기에서 바로 keyPath!

keyPath + dynamicMemberLookUp

keyPath를 통해서 프로퍼티에 접근 할수 있었고, 만약 프로퍼티가 없다면 에러를 방출했었다.

이것을 착안하여 dynamicMemberLookUp을 사용하게 되면 다음과 같이 에러를 잡을수 있다.

  • 위에서는 딕셔너리로 넣었지만, 왜 밑에서는 struct Person이 들어가는가?
    • keyPath는 인스턴스의 프로퍼티를 keyPath를 통해서 접근할수 있도록 하는것이기 때문임.

Untitled.png

여기에서 people.jin 이런거는 바로 에러나옴!


참고자료

bookmark

bookmark

반응형

' > Swift' 카테고리의 다른 글

Swift) Associated type  (0) 2024.01.01
UIKit) Dynamic App Icon 변경하기  (0) 2024.01.01
Swift) KeyPath란  (0) 2024.01.01
Swift) CodingKey, API명과 codable 타입 이름이 다를때 매핑하는법  (0) 2024.01.01
Swift) NSCache와 NSDictionary  (0) 2023.09.07