NSKeyValueCoding
내의 일부 메서드는 속성 이름을 기반으로 명명 된 클래스의 특수 메서드를 참조 할 수 있습니다. 예를 들어 - validateValue: forKey: error:
동안 키 "testers
"을 작업하면 - validateTesters: error:
이라는 메서드가 검색됩니다.이 메서드는 Swift에서 어떻게 작동합니까? NSKeyValueCoding
은 비공식 프로토콜이기 때문에 중요합니다. 이러한 메서드 중 하나에 대해 이름 및/또는 서명을 잘못 가져도 컴파일러 오류가 발생하지는 않으므로 무시하고 메서드를 무시하고 대신 기본 동작을 얻습니다 (악화 될 수 있음) .Swift에서 KVC (NSKeyValueCoding)의 형태는 무엇입니까?
0
A
답변
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
수정 된 답변보기 –
그것은을 ObjC 실행 시간을 사용할 수있다 따라서
NSObject
에서 상속과 클래스를 정의: 어떻게하는지 보여주기 위해 예제를 통해 살펴 보겠습니다 – Wain
@Wain, 메소드 원형 (Objective-C 대신 Swift를 사용하는 경우 텍스트 편집기에서 무엇을 입력해야하는지)을 묻습니다. . – CTMacUser
당신은 objc에서 런타임에 대해 더 많이 볼 수 있습니다. Swift에서 Reflection을 사용할 것이지만 충분히 강하지 않다. –