2017-12-07 3 views
-1

전에 Swift4를 사용 해 본 적이 없으며, KVC를 사용하는 방법을 모릅니다.
은 여기, 사전에 코드를 모델을 만들려고 :Swfit 4.0에서 키 - 값 코딩을 사용하려면 어떻게해야합니까?

class Person : NSObject { 
    var name: String = "" 
    var age: Int = 0 

    init(dict: [String : Any]) { 
     super.init() 
     self.setValuesForKeys(dict) 
    } 
} 

let dict: [String : Any] = ["name" : "Leon", "age" : 18] 
let p = Person(dict: dict) 
print(p.name, p.age) 

내가 얻을이 질문 :
1. 왜 AnyObject를 사용 해달라고? "Leon"18StringInt으로 추측되었지만, KVC에서 사용 했습니까?
이 양식은 작동하지만 이해할 수 없습니다.

모두에게 감사드립니다. 모든 클래스는 NSObject를 상속 신속한에서

+0

코드를 다시 읽으면 "AnyObject"의 키가있는 "keys"에 대한 값이 설정됩니다. 나는 또한 질문의 두 번째 부분을 이해하지 못한다 – zombie

+0

위의 코드는 잘못되었습니다. 포착되지 않은 예외가 발생하면 XCode가 중단됩니다. '@ objc'를 사용하면 작동합니다. 나는 그것이 어떻게 작동하는지 이해하지 못한다. – Ben

+0

다음에 물어보기 전에 검색하십시오. [What is @objc] (https://stackoverflow.com/a/45491576/6689101) – zombie

답변

2

, 당신은 두 가지가 필요 스위프트 4의 속성에 대한 KVC 지원을 구현하려면 다음 KVC의 현재 구현이 목표 - C로 작성되어 있기 때문에 당신의 @objc 주석이 필요

  1. 당신의 속성을 사용하여 Objective-C가 볼 수 있도록합니다. 이것은 또한 속성의 유형이 Objective-C와 호환되어야 함을 의미합니다.

  2. 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 값이 변경되면 등록 정보가 통지됩니다.

+0

매우 감사합니다! 이제 KVC가 Swift에서 어떻게 작동하는지 알았습니다. – Ben

+0

@Ben 나는 대답을 약간 정제했다. 편집을 참조하십시오. –

+0

도움 주셔서 감사합니다. 나는 그것에 대해 깊이 연구 할 것이다. 마지막 질문에 대답 할 수 있습니까? 스위프트에서 KVC에 대해 더 자세히 알아야 할 문서는 무엇입니까? 나는 애플의 영어 문서를 잘 못한다 ... – Ben

0
  1. 유형에 상관,

  2. @objc이 목표 - C 클래스입니다 AnyObject 예를 들어 호출하지 인스턴스를 입력있다, KVC 준수합니다.

주요 경로 표현은

class Animal: NSObject { 
    @objc var name: String 

    init(name: String) { 
     self.name = name 
    } 
} 

let llama = Animal(name: "Llama") 
let nameAccessor = \Animal.name 
let nameCountAccessor = \Animal.name.count 
llama[keyPath: nameAccessor] 
// "Llama" 
llama[keyPath: nameCountAccessor] 
// "5" 

Using Swift with Cocoa and Objective-C 자세히에게

+0

답변 해 주셔서 감사합니다. 또 다른 질문이 있습니다. KVC는 대개 Swift4.0에서 어떻게 사용됩니까? Apple 문서를 확인했지만 정확한 예를 찾을 수 없습니다. – Ben

+0

하지만 사전 전송 모델을하고 싶습니다. 일반적으로 변수가 아닌 사전을 사용합니다. 어떻게 사용합니까? 대답에 대해 – Ben

0
  1. 코드

    를가 같은 \ Animal.name.count 재산 참조 및 체인 속성 참조를 받아 들인다

    var name: String = "" var age: Int = 0

    유형에 대해 확신 할 때 이와 같은 코드를 작성할 수 있습니다. AnyObject는 클래스 타입에 사용되는 동안

    var name = "" var age = 0

    모든

    는 일반적으로 모든 종류의 (기능 유형 및 옵션 타입)에 사용됩니다.

  2. @objc는 다른 의미를 가지고 있습니다. 빠른 클래스에서 @objc를 사용하면 그 코드는 objective-c에서 사용할 수 있습니다. @objc 속성을 사용하여 objective-c 클래스와 동일하게 지정해야합니다. 결과적으로 구형 아카이브는 새로운 신속 클래스로 대체 될 수 있습니다.

+0

주셔서 감사합니다. KVC가 Swift 4.0에서 보통 어떻게 사용합니까? – Ben

관련 문제