Swift 4.2响应Selector返回false,如何检查属性是否存在?

时间:2019-01-16 15:47:59

标签: swift swift4.2

在下面的示例中,我希望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中的操场代码)

1 个答案:

答案 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")