Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 모바일
- combine
- test
- Navigation
- swiftdata
- SWIFTUI
- navigationsplitview
- SWIFT
- Alamofire
- regex
- github
- Git
- tuist #xcodecloud #ios #ci/cd #swiftlint #firebase
- UI
- ios18
- network
- TCA
- IOS
- Firebase
- 정규표현식
- xcode
- 개발
- concurrency
- Tuist
- ObjC
- xcodecloud
- uikit
- iOS 개발자
- iOS 13.0+
- composablearchitecture
Archives
- Today
- Total
iOS 개발 기록
KVC와 KVO란? 본문
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
'Swift' 카테고리의 다른 글
[iOS] PencilKit (0) | 2022.07.07 |
---|---|
Swift 의 메모리 관리 (ARC, weak, unowned, lazy) (0) | 2022.05.31 |
Swift의 특징과 프로그래밍 패러다임 (0) | 2022.05.31 |
[Swift]Combine - Publisher, Subscriber, NotificationCenter (0) | 2022.04.18 |
Swift - Opaque Type ( 불투명 반환 타입 ) (0) | 2022.04.14 |