[iOS] KVC, KVO

승아·2021년 4월 13일
1

✅⠀KVC란? ( 참고 사이트 )

  • Key-Value Coding
  • 객체의 값을 직접 가져오지 않고, Key 또는 KeyPath를 이용해서 간접적으로 데이터를 가져오거나 수정하는 방법

Swift에서 keypath로 vlaue 가져오기

struct Dog{
    var name: String
}

struct Animal{
    var species: Dog
}

let dog = Dog(name: "bingo")
var bingo = Animal(species: dog)

bingo[keyPath: \.species.name] // "bingo" 출력
bingo[keyPath: \.species.name] = "mango" // 수정도 가능하다

KeyPath 만들기

  • \BaseType.ProperyName으로 만들어준다.
let myKeyPath = \Animal.species.name

bingo[keyPath: myKeyPath]

KeyPath 종류

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

✅⠀KVO란? ( 참고 사이트, Apple Developer )

  • Key-Value Observing
  • 다른 개체의 속성에 대한 변경 사항을 개체에 알리기 위해 사용하는 Cocoa 프로그래밍 패턴
  • 모델과 뷰와 같이 논리적으로 분리 된 앱 부분 간의 변경 사항을 전달하는 데 유용합니다.
  • NSObject 에서 상속하는 클래스에서만 키-값 관찰을 사용할 수 있습니다.

Annotate a Property for Key-Value Observing

  • @objc attribute and the dynamic modifie를 달아줍니다.
class Dog: NSObject{
    @objc dynamic var name: String
    
    init(name: String){
        self.name = name
    }
}

Define an Observer

  • 관찰자 클래스의 인스턴스는 하나 이상의 속성에 대한 변경 사항에 대한 정보를 관리합니다.
  • 관찰자를 만들 때 관찰 하려는 속성을 참조하는 키 경로로 메서드를 호출하여 관찰을 시작 합니다.
var dog = Dog(name: "bingo")

dog.observe(\.name, options: [.old, .new]) { (object, change) in
    print("old : \(change.oldValue) , new : \(change.newValue)")
}

dog.name = "mango"

프로퍼티 옵저버와 비교

  • 프로퍼티 옵저버는 타입 정의 내부에 위치 KVO는 타입 정의 외부에서 observer를 추가할 때 사용

0개의 댓글