swift

KVC, KVO

motosw3600 2021. 12. 8. 22:47

KVC(Key-Value Coding)

  • 특정 문자열(keyPath)을 통해 프로퍼티에 접근가능한 방법
  • 객체의 값을 직접 가져오지 않고, Key 또는 KeyPath를 통해 간접적으로 데이터를 가져오는 방법
struct Rectangle {
    var size: Int
}

struct Figure {
    var division: Rectangle
}

let rectangle = Rectangle(size: 20)
var figure = Figure(division: rectangle)

figure[keyPath: \.division.size] // 20
figure[keyPath: \.division.size] = 10 // 10

KeyPath 생성

let figureKeyPath = \Figure.division.size

figure[keyPath: figureKeyPath] // 20

KeyPath 종류

  • KeyPath : Read only
  • WritableKeyPath : value type 인스턴스에서 사용, read & write 접근 가능
  • ReferenceWritableKeyPath : 클래스의 인스턴스에서 사용. read & write 접근 가능

KVO(Key-Value Observing)

  • 객체의 프로퍼티가 변경되는 것을 알고 싶을 때 사용
  • NSObject를 상속하는 클래스에서만 사용 가능
  • ex) View와 ViewModel간의 상태에따른 객체의 변경사항을 알릴때 사용
class Rectangle: NSObject {
   @objc dynamic var size: Int
   
   init(size: Int) {
      self.size = size
   }
}

KVO와 프로퍼티 감시자(Property Observers)의 차이

타입을 직접 만들때는 프로퍼티 감시자를 통해(willSet, didSet) 직접 구현해줄 수 있지만 외부 라이브러리에서 정의한 타입은

재정의가 불가능 하기 때문에 이때 KVO를 사용하여 프로퍼티의 값이 변경되는지 확인할 수 있다.

KVO는 상속 및 재정의없이 Observing이 가능하다.

'swift' 카테고리의 다른 글

Method Swizzling  (0) 2021.12.10
Layout Update Method  (0) 2021.12.09
Properties  (0) 2021.12.08
ARC(Auto Reference Count)  (0) 2021.12.07
Strong, Weak, Unowned, 순환참조  (0) 2021.12.07