Objective-C/Swift中使用KVCKVO总是需要格外小心,因为对于keykeyPath,我们使用的是字符串字面量来处理。这样在编译期无法检测我们的输入是否正确,或许我们会因为一时大意,多写了或少写了一个字符,或拼错了单词。而这个错误只能在运行时,程序崩溃时才能发现,很不爽的吧。

为此,在Swift 3中引入了#keyPath()这个表达式,它接收Object.property形式的参数,并将其转换成字符串,如下代码所示。因为使用的是对象和属性的方式,所以在编译时,编译器能去检测这个表达式是否有效,从而避免了上面的问题。

class Person: NSObject {
    dynamic var firstName: String = ""
    
    init(firstName: String) {
        self.firstName = firstName
    }
}

let chris = Person(firstName: "Chris")


#keyPath(Person.firstName) // => "firstName"
chris.value(forKeyPath: #keyPath(Person.firstName))

参考

  1. Referencing Objective-C key-paths