gpt4 book ai didi

swift - Swift 中 KVC(NSKeyValueCoding)有哪些形式?

转载 作者:行者123 更新时间:2023-11-30 13:22:26 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com