Open yoogail105 opened 2 years ago
let brandNameKeyPath = \Brand.name
let mainColorKeyPath = \Brand.mainColor
let subColorKeyPath = \Brand.subColor
Brand.name
이 let
으로 선언되어있기 때문에, 자동으로 KeyPath 타입이 된다. KeyPath는 Read-Only로 값을 수정할 수 없다.Brand.mainColor
가 var
으로 선언되어있기 때문에, 자동으로 WritableKeyPath가 된다. WritableKeyPath는 값을 수정할 수 있다.
앞서 keyPath를 통해 값에 접근하면서 \.mainColor.name
r와 같이 사용할 수 있었던 것은, popo로 인해 컴파일러가 Brand라는 타입을 추론할 수 있기 때문에 생략이 가능했던 것이다.
let mainColor = popo[keyPath: \.mainColor.name]
let subColor = popo[keyPath: \.subColor.name]
keyPath를 정의했기 때문에, 다음과 같이 사용할 수 있다.
let popoMainColor = popo[keyPath: mainColorKeyPath]
let poposubColor = popo[keyPath: subColorKeyPath]
class에 대해 keyPath로 접근하는 경우
class ColorChartClass {
let name: String
var hexCode: String
init(name: String, hexCode: String) {
self.name = name
self.hexCode = hexCode
}
}
class BrandClass {
let name: String
var mainColor: ColorChart
var subColor: ColorChart
init(name: String, mainColor: ColorChart, subColor: ColorChart) {
self.name = name
self.mainColor = mainColor
self.subColor = subColor
}
}
let subColorClassKeyPath = \BrandClass.subColor
하지만, mainColor가 let인 경우라면 keyPath타입 할당
class ColorChartClass {
let name: String
var hexCode: String
init(name: String, hexCode: String) {
self.name = name
self.hexCode = hexCode
}
}
class BrandClass {
let name: String
let mainColor: ColorChart
var subColor: ColorChart
init(name: String, mainColor: ColorChart, subColor: ColorChart) {
self.name = name
self.mainColor = mainColor
self.subColor = subColor
}
}
let subColorClassKeyPath = \BrandClass.subColor
struct ColorChart {
let name: String
var hexCode: String
}
struct Brand { let name: String var mainColor: ColorChart var subColor: ColorChart }
var red = ColorChart(name: "red", hexCode: "FF0000") var blue = ColorChart(name: "blue", hexCode: "00FF00") let popo = Brand(name: "popo", mainColor: red, subColor: blue)
// keyPath 만들기 let brandNameKeyPath = \Brand.name let mainColorKeyPath = \Brand.mainColor let subColorKeyPath = \Brand.subColor
// keyPath로 값에 접근하기 let mainColor = popo[keyPath: mainColorKeyPath] let subColor = popo[keyPath: subColorKeyPath]
print("popoMainColor: (mainColor.name), popoSubColor: (subColor.name)") // popoMainColor: red, popoSubColor: blue
KeyPath:
\BaseType.PropertyName
KeyPath 사용하기
🔖 참고