2016-06-04 3 views
0

NSKeyValueCoding 내의 일부 메서드는 속성 이름을 기반으로 명명 된 클래스의 특수 메서드를 참조 할 수 있습니다. 예를 들어 - validateValue: forKey: error: 동안 키 "testers"을 작업하면 - validateTesters: error:이라는 메서드가 검색됩니다.이 메서드는 Swift에서 어떻게 작동합니까? NSKeyValueCoding은 비공식 프로토콜이기 때문에 중요합니다. 이러한 메서드 중 하나에 대해 이름 및/또는 서명을 잘못 가져도 컴파일러 오류가 발생하지는 않으므로 무시하고 메서드를 무시하고 대신 기본 동작을 얻습니다 (악화 될 수 있음) .Swift에서 KVC (NSKeyValueCoding)의 형태는 무엇입니까?

+0

그것은을 ObjC 실행 시간을 사용할 수있다 따라서 NSObject에서 상속과 클래스를 정의

: 어떻게하는지 보여주기 위해 예제를 통해 살펴 보겠습니다 – Wain

+0

@Wain, 메소드 원형 (Objective-C 대신 Swift를 사용하는 경우 텍스트 편집기에서 무엇을 입력해야하는지)을 묻습니다. . – CTMacUser

+0

당신은 objc에서 런타임에 대해 더 많이 볼 수 있습니다. Swift에서 Reflection을 사용할 것이지만 충분히 강하지 않다. –

답변

0

ObjC의 동적 특성을 이용합니다.

class Person: NSObject { 
    var firstName: String 
    var lastName: String 

    init(firstName: String, lastName: String) { 
     self.firstName = firstName 
     self.lastName = lastName 
    } 

    func validateFirstName(value: AutoreleasingUnsafeMutablePointer<AnyObject?>) throws { 
     guard let firstName = value.memory as? String else { 
      // You can decide to throw an error or not here 
      return 
     } 

     if firstName == "Jack" { 
      throw NSError(domain: NSCocoaErrorDomain, code: 0, userInfo: [NSLocalizedDescriptionKey: "I don't like the firstName Jack"]) 
     } 
    } 
} 

시험 :

let p = Person(firstName: "John", lastName: "Smith") 

var newFirstName: AnyObject? = "Jack" 
var newLastName: AnyObject? = "Johnson" 

do { 
    try p.validateValue(&newFirstName, forKey: "firstName") 

    // This line will not execute if newFirstName == "Jack" 
    print("No problem validating firstName") 
} catch let error as NSError { 
    print(error.localizedDescription) 
} 

do { 
    try p.validateValue(&newLastName, forKey: "lastName") 
    print("No problem validating lastName") 
} catch let error as NSError { 
    print(error.localizedDescription) 
} 
+0

필자는 애플이 어떻게 구현하는지 상관하지 않고, 함수의 이름 형식과 서명이 무엇인지에 관심이있다. Objective-C에 대한 가이드를 제공하는 가이드가 Swift 용으로 업데이트되지 않았기 때문입니다. – CTMacUser

+0

수정 된 답변보기 –