在下面的示例中,我希望x.responds(to: Selector(name))
返回true。但是事实并非如此。
x.value(forKeyPath: name)
引发signal SIGABRT
错误。
相同的代码在Swift 3中也起作用。
我的问题:如何检查类(从NSObject扩展)中的属性,并根据字符串检索它们。
import UIKit
class Test: NSObject {
var test = "test"
}
func property(_ object: Any, _ name: String) -> Bool? {
let x = object as? NSObject
// x?.value(forKeyPath: name)
return x?.responds(to: Selector(name))
}
property(Test(), "test")
(Swift 4.2中的操场代码)
答案 0 :(得分:1)
在@objc
前面放置var test
可以解决问题。
import UIKit
class Test: NSObject {
@objc var test = "test"
}
func property(_ object: Any, _ name: String) -> Bool? {
let x = object as? NSObject
x?.value(forKeyPath: name)
return x?.responds(to: Selector(name))
}
property(Test(), "test")