Swift
KVC와 KVO란?
택꽁이
2022. 5. 31. 16:34
728x90
KVC와 KVO란?
KVC 정의
: Key-Value-Coding.
- Key는 String
- Key나 KeyPath를 이용해 간접적으로 데이터를 가져온다.
- 객체간 의존성을 낮추고, 결합도가 낮은 소프트웨어를 개발할 수 있게 한다.
- NSKeyValueCoding 프로토몰에 의해 정의한다.
KVC 로직 :
1. Key와 일치하는 프로퍼티를 찾는다.
2. 일치하는 프로퍼티가 없다면 Key와 일치하는 인스턴스 변수를 찾는다.
3. 일치하는 프로퍼티나 인스턴스 변수가 있다면 적용, 없으면 'valueForUndiginedkey'나 'setValue:forUndefinedkey'를 호출한다.
사용 :
위와 같은 로직으로 동작하기 때문에 프로퍼티를 통한 직접 접근보다 느리며, runtime에 접근하기 때문에 Key가 일치하지 않아 크래시가 발생하기도 한다. 소프트웨어 구조적 측면에서 유연성이 필요한 경우에만 사용하는 것이 좋다.
struct Hop {
var hopName: String
}
struct Beer {
var hop: Hop
}
let citra = Hop(hopName: "citra")
let beer = Beer(hop: citra)
let IPA = beer[keyPath: \.hop]
let likeHop = beer[keyPath: \.hop.hopName]
print(likeHop) // citra
KVO 정의
: Key-Value-Observing. 객체의 프로퍼티가 변경되는 것을 감지하고 알려준다.
아는 타입이라면 willSet, didSet으로 구현할 수 있겠지만 외부 라이브러리 등 모르는 타입으로 정의된 경우에 KVO를 통해 관찰할 수 있다.
사용 예
combine
let queue = OperationQueue()
let subscription = queue.publisher(for: \.operationCount)
.sink {
print("Outstanding operations in queue: \($0)")
}
Custom
: NSObject 상속, @objc dynamic 을 통해서 사용
class TestObject: NSObject {
@objc dynamic var integerProperty: Int = 0
}
let obj = TestObject()
let subscription = obj.publisher(for: \.integerProperty)
.sink {
print("integerProperty changes to \($0)")
}
obj.integerProperty = 100
obj.integerProperty = 200
integerProperty changes to 0
integerProperty changes to 100
integerProperty changes to 200