- Key-Value Coding
- 객체의 값을 직접 가져오지 않고, Key 또는 KeyPath를 이용해서 간접적으로 데이터를 가져오거나 수정하는 방법
Swift에서 keypath로 vlaue 가져오기
struct Dog{
var name: String
}
struct Animal{
var species: Dog
}
let dog = Dog(name: "bingo")
var bingo = Animal(species: dog)
bingo[keyPath: \.species.name]
bingo[keyPath: \.species.name] = "mango"
KeyPath 만들기
- \BaseType.ProperyName으로 만들어준다.
let myKeyPath = \Animal.species.name
bingo[keyPath: myKeyPath]
KeyPath 종류
- KeyPath : Read only
- WritableKeyPath : value type 인스턴스에서 사용, read & write 접근 가능
- ReferenceWritableKeyPath : 클래스의 인스턴스에서 사용. read & write 접근 가능
- Key-Value Observing
- 다른 개체의 속성에 대한 변경 사항을 개체에 알리기 위해 사용하는 Cocoa 프로그래밍 패턴
- 모델과 뷰와 같이 논리적으로 분리 된 앱 부분 간의 변경 사항을 전달하는 데 유용합니다.
- NSObject 에서 상속하는 클래스에서만 키-값 관찰을 사용할 수 있습니다.
Annotate a Property for Key-Value Observing
- @objc attribute and the dynamic modifie를 달아줍니다.
class Dog: NSObject{
@objc dynamic var name: String
init(name: String){
self.name = name
}
}
Define an Observer
- 관찰자 클래스의 인스턴스는 하나 이상의 속성에 대한 변경 사항에 대한 정보를 관리합니다.
- 관찰자를 만들 때 관찰 하려는 속성을 참조하는 키 경로로 메서드를 호출하여 관찰을 시작 합니다.
var dog = Dog(name: "bingo")
dog.observe(\.name, options: [.old, .new]) { (object, change) in
print("old : \(change.oldValue) , new : \(change.newValue)")
}
dog.name = "mango"
프로퍼티 옵저버와 비교
- 프로퍼티 옵저버는 타입 정의 내부에 위치 KVO는 타입 정의 외부에서 observer를 추가할 때 사용