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

标签 swift cocoa kvc

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/

相关文章:

ios - 如何查询我的数据并将它们按类别存储在数组中,以便按类别在 TableView 中显示它们?

ios - 如何使用swift语言创建json数据并将其发送到服务器

objective-c - Obj-C/Cocoa 接线接口(interface)对象

iOS:KVC,当我退出我的应用程序时,KVC 出现问题

xcode - Interface Builder 的用户定义的运行时属性不接受 float ?

ios - UICollectionView invalidateLayout 不会在屏幕方向更改时触发 sizeForItem

objective-c - 将 AppleScript 响应转换为 JSON

cocoa - 如何解析使用 NSKeyedArchiver 创建的外部文件的内容

ios - 如何为 self.typeOfAssetLabel.text 进行 KVC

ios - 在 Swift 3 中从 UserDefaults 读取存储数组时出现问题