NSKeyValueCoding
中的某些方法可以引用根据属性名称命名的类的专用方法。 (例如,在 - validateValue: forKey: error:
期间处理键“testers
”将查找名为 - validateTesters: error:
的方法>.) 这在 Swift 中是如何工作的?这很重要,因为 NSKeyValueCoding 是一种非正式协议(protocol),因为这些方法之一的名称和/或签名错误不会导致编译器错误,但会忽略该方法并获得默认行为相反(这可能更糟)。
最佳答案
它利用了 ObjC 的动态特性。为了演示它是如何完成的,让我们看一个示例:
定义一个继承自 NSObject
的类,从而可以使用 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)
}
关于swift - Swift 中 KVC(NSKeyValueCoding)有哪些形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37629378/