키 경로
- 프로퍼티는 값을 바로 꺼내오는 것이 아니라 프로퍼티의 위치를 참조할 수 있도록 할 수 있다. 즉, 키 경로를 저장해서 특정 타입이나 인스턴스의 특정 프로퍼티를 미리 지정해두고 사용할 수 있다.
- 키 경로 타입은
AnyKeyPath
라는 클래스에서 파생된다.
- 제일 많이 확장된 키 경로 타입은
WritableKeyPath<Root, Value>
와 ReferenceWritableKeyPath<Root, Value>
가 존재한다.
- 키 경로는
\
와 .
로 표현한다.
\타입이름
.경로
.경로
.경로
class Person{
var name: String
init(name: String){
self.name = name
}
}
struct Stuff{
var name: String
var onwer: Person
}
print(type(of:\Person.name))
print(type(of:\(Stuff.name))
- 다음과 같이 미리 키 경로를 저장해둘 수도 있다.
\.
은 해당 타입을 의미한다.
let keyPath = \Stuff.owner
let nameKeyPath = keyPath.appending(path: \.name)
키 경로 서브스크립트
class Person{
var name: String
init(name: String){
self.name = name
}
}
struct Stuff{
var name: String
var onwer: Person
}
let yagom = Person(name: "yagom")
let hana = Person(name: "hana")
let macbook = Stuff(name: "MacBook Pro", owner: yagom)
var iMac = Stuff(name: "iMac", owner: yagom)
let iPhone = Stuff(name: "iPhone", owner : hana)
let stuffNameKeyPath = \Stuff.name
let ownerKeyPath = \Stuff.owner
let ownerNameKeyPath = onwerKeyPath.appending(path: \.name)
print(macbook[keyPath: stuffNameKeyPath])
print(iMac[keyPath: stuffNameKeyPath])
print(iPhone[keyPath: stuffNameKeyPath])
print(macbook[keyPath: ownerNameKeyPath])
print(iMac[keyPath: ownerNameKeyPath])
print(iPhone[keyPath: ownerNameKeyPath])