-
KVO(Key-Value-Observing)Swift 2019. 9. 20. 17:49728x90
객체의 어떤 값이 변경되었을 경우 이를 감지하기 위해 사용한다.
KVO는 변수에 코드를 붙여 변수가 변경될 때마다 코드가 실행되도록 하는 방법이다. property observers(willset , didSet)과 아주 유사한데 KVO는 타입 정의 밖에서 observe를 추가한다는 점이 다르다.
KVO는 순수 스위프트 코드로는 그리 좋지 않은데, Objective-c 런타임에 의존하고 있기 때문이다. 그래서 NSObject 를 상속받기 위해
@objc
를 반드시 붙여줘야 한다. 특히 KVO는 속성 각각에@objc dynamic
을 붙여줘야 한다.dynamic
은 objective-c 의 문법의 하난데, 특정 method나 function의 구현을 objective-c 런타임에서 하겠다고 결정하는 것이다. 예를들어, 하위클래스가 상위 클래스의 메서드를 override 할 때 dynamic dispatch 는 어떤 메서드의 구현해야 하는지 파악한다.예를 살펴보자,
@objc class Person: NSObject { @objc dynamic var name = "Woongs" } let woongs = Person
그리고 이제 처음에 말했듯이 상태 변화를 감지하기 위한 코드를 붙여, 변수가 변경될 때마다 코드가 실행되도록 해보자.
woongs.observe(\Person.name, options: .new) { person, change in print("I'm now called \(person.name)") }
이렇게 하면 새로운 변수가 들어오는지 보고 있다가 변수가 set 되자마자 person 의 이름을 print 한다.
비록 KVO가 순수한 Swift 코드는 아니지만 Apple의 자체 API로 작업할 때는 더 좋다. 이들이 모두 objective-c로 되어있기 때문에 모두 @objc 와 dynamic이기 때문이다.
하지만 주의해야 할 것은, 비록 UIKit의 많은 부분이 KVO와 작동하지만 이는 약속이라기 보다는 우연으로 봐야한다. 애플은 앞으로도 UIKit이 KVO와 호환될거라고 보장하지 않는다.
참고
'Swift' 카테고리의 다른 글
Variadic functions, 불특정 개수 파라미터 (0) 2019.10.24 Class vs Struct in Swift (0) 2019.10.21 Swift) 배열의 중복체크 (0) 2019.07.25 Swift) 소수점 다루기 (0) 2019.07.22 Swift) 스위프트에서 '모든 것은 객체다' (1) 2019.07.02