반응형
KVC(Key-Value Coding)
KVC(Key-Value Coding)이란, Key 혹은 KeyPath를 통해 간접적으로 데이터를 가져오거나 수정하는 방법입니다. Key는 String이며 일반적으로 객체 내에 정의된 method, property의 이름이 됩니다. 또한 아스키로 인코딩이 가능하며 소문자로 시작, 공백이 없어야합니다.
struct Address {
var town: String
}
struct Person {
var address: Address
}
let seoul = Address(town: "건대입구역")
let inu = Person(address: seoul)
let inuAddress = inu[keyPath: \.address]
let inuTown = inu[keyPath: \.address.town]
print(inuTown) // 건대입구역
inu[keyPath: \.address.town] = "강남역"
print(inuTown) // 강남역
이런 방식으로 사용이 가능합니다. \.address.town
과 같은 KeyPath는 생성해서 반복적으로 사용할 수 있습니다.
let writableKeyPath = \Person.address.town
print(inu[keyPath: writableKeyPath]) // 강남역
KeyPath에는 여러 종류가 있습니다.
- AnyKeyPath : 타입이 지워진 KeyPath
- PartialKeyPath : 부분적으로 타입이 지워진 KeyPath
- KeyPath : Read-only KeyPath. 만약 let 프로퍼티에 접근할 경우 이를 사용해야함.
- WritableKeyPath : value type 인스턴스에 사용 가능한 KeyPath. 변경 가능한 모든 프로퍼티에 대한 read & write access 제공
- ReferenceWritableKeyPath : class의 인스턴스에 사용 가능 가능한 KeyPath. 변경 가능한 모든 프로퍼티에 대한 read & write access 제공.
KVO(Key-Value Observing)
KVO(Key-Value Observing)이란, 객체의 프로퍼티에 대한 변경사항을 다른 객체에 알리기 위해 사용되는 코코아의 프로그래밍 패턴입니다. NSObject를 상속한 클래스에서만 KVO를 사용할 수 있습니다.
Observing이 필요한 객체가 NSObject를 상속받고, Observing하려는 프로퍼티에 @objc
속성과 dynamic
키워드를 추가합니다.
class Address: NSObject {
@objc dynamic var town: String
init(town: String) {
self.town = town
}
}
Observer를 생성합니다. KeyPath를 통해 프로퍼티에 대한 Observer를 추가할 수 있습니다.
var address = Address(town: "서울특별시")
address.observe(\.town, options: [.old, .new]) { (object, change) in
print(change.oldValue, change.newValue)
}
address.town = "청주시"
// Optional("서울특별시") Optional("청주시")
town이 변경되면 Observer에게 change handler가 호출되면서 oldValue와 newValue가 출력됩니다. option으로는 현재 .old
와 .new
가 추가되어 있습니다. option에는 총 4가지가 있습니다.
- old : 바뀌기 이전값 호출
- new : 바뀐 후의 값 호출
- initial : 초기화할 때도 호출
- prior : 이전 상태도 함꼐 전달
이러한 KVO는 두 객체간의 동기화를 쉽게 달성할 수 있고 객체의 구현을 직접적으로 건드리지 않더라도 내부 객체의 상태 변화에 대응할 수 있다는 장점이 있습니다.
참고
반응형
'🍎 Apple > Swift' 카테고리의 다른 글
[Swift] Generic (0) | 2022.03.07 |
---|---|
[Swift] NotificationCenter (0) | 2022.03.07 |
[Swift] Monad (0) | 2022.03.01 |
[Swift] Property Wrapper (0) | 2022.02.24 |
[Swift] Copy on write (2) | 2022.01.26 |