我正在尝试获取类中IBOutlet的所选属性的键路径。但是得到:
Type 'UIButton?' has no member 'isSelected'
直接访问UIButton.isSelected键路径有效,但不能满足我的用例。
@objc class Demo: UIViewController{
@IBOutlet @objc dynamic weak var button: UIButton!
}
var demo = Demo()
print(#keyPath(UIButton.isSelected)) // no error
print(#keyPath(Demo.button.isSelected)) // error
print(#keyPath(demo.button.isSelected)) // error
我想念什么?
答案 0 :(得分:2)
#keyPath
只是创建字符串值的语法糖,同时确保keyPath
对您指定的对象有效;它有助于防止在使用KVO时发生崩溃,因为它会在编译时验证keyPath
是否有效,而不是在运行时崩溃(
因此,您没有在特定实例上指定keyPath
,而是在对象类型上指定了它。这就是为什么您的第一行有效而后两行无效的原因。
您在调用keyPath
时指定要在其上观察addObserver
的特定对象实例:
demo.addObserver(someObserver, forKeyPath: #keyPath(UIButton.isSelected), options: [], context: nil)
您也可以说
demo.addObserver(someObserver, forKeyPath: "selected", options: [], context: nil)
结果相同
但是,如果您不小心键入了"slected"
而不是"selected"
,直到应用程序在运行时崩溃,您才会发现,而#keyPath(UIButton.isSlected)
会立即给您带来编译器错误。