, 당신은 두 가지가 필요 스위프트 4의 속성에 대한 KVC 지원을 구현하려면 다음 KVC의 현재 구현이 목표 - C로 작성되어 있기 때문에 당신의 @objc
주석이 필요
당신의 속성을 사용하여 Objective-C가 볼 수 있도록합니다. 이것은 또한 속성의 유형이 Objective-C와 호환되어야 함을 의미합니다.
Objective-C에 속성을 표시하는 것 외에도 속성이 변경 될 때 관찰자에게 알림을 보내려면 알림을 설정해야합니다.이 작업을 수행하는 세 가지 방법이 있습니다 :
저장 속성이 할 수있는 가장 쉬운 일이 그렇게 같은 dynamic
키워드를 추가하는 것입니다 : 이것은 코코아 목표 - C의 마법을 사용할 수 있습니다
@objc dynamic var foo: String
필요로하는 알림을 자동으로 생성하고 일반적으로 원하는 것입니다. 당신이 세밀하게 제어를 필요로하는 경우에는, 당신은 또한 수동으로 통지 코드를 작성할 수 있습니다 :
@objc private static let automaticallyNotifiesObserversOfFoo = false
@objc var foo: String {
willSet { self.willChangeValue(for: \.foo) }
didSet { self.didChangeValue(for: \.foo) }
}
automaticallyNotifiesObserversOf<property name>
속성은 우리가 통지를 처리하는 KVC/KVO 시스템에 나타 내기 위해이 자신과 코코아는 안된다고 우리를 위해 그들을 생성하려고합니다.
재산이 저장 아니라 다른 속성이나 특성에 따라되지 않은 경우
마지막으로, 당신은 너무 같은 keyPathsForValuesAffecting<your property name here>
방법을 구현해야 : 위의 예에서
@objc dynamic var foo: Int
@objc dynamic var bar: Int
@objc private static let keyPathsForValuesAffectingBaz: Set<String> = [
#keyPath(foo), #keyPath(bar)
]
@objc var baz: Int { return self.foo + self.bar }
의 baz
의 관찰자 foo
값 또는 bar
값이 변경되면 등록 정보가 통지됩니다.
코드를 다시 읽으면 "AnyObject"의 키가있는 "keys"에 대한 값이 설정됩니다. 나는 또한 질문의 두 번째 부분을 이해하지 못한다 – zombie
위의 코드는 잘못되었습니다. 포착되지 않은 예외가 발생하면 XCode가 중단됩니다. '@ objc'를 사용하면 작동합니다. 나는 그것이 어떻게 작동하는지 이해하지 못한다. – Ben
다음에 물어보기 전에 검색하십시오. [What is @objc] (https://stackoverflow.com/a/45491576/6689101) – zombie