如何快速使用NSSelectorFromString?

时间:2018-08-24 23:25:49

标签: swift

我不明白为什么这总是失败。有什么帮助吗? 显然,我不理解 NSStringFromSelector 的工作原理吗? 这是我的代码如下:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let selector = NSSelectorFromString("test(value:value2:)")
        if self.responds(to: selector) {
            print("it works")
        } else {
            print("it failed")
        }
    }

    func test(value: Int, value2: Int) {
    }
}

3 个答案:

答案 0 :(得分:1)

只需使用#selector

let selector = #selector(test(value:value2:))

并使用@objc

进行函数声明
@objc func test(value: Int, value2: Int) {

}

答案 1 :(得分:1)

您有几个问题,首先,要使NSSelectorFromString工作,方法本身以及类都应声明为@objc,其次,首选的方法是使用#selector,可以在编译时检查选择器的有效性。

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        if self.responds(to: #selector(test(value:value2:))) {
            print("it works")
        } else {
            print("it failed")
        }
    }

    @objc
    func test(value: Int, value2: Int) {

    }
}

答案 2 :(得分:1)

您的选择器字符串格式错误。 NSSelectorFromString的选择器字符串必须看起来像Objective-C签名。

尝试:

let selector = NSSelectorFromString("testWithValue:value2:")

并且您的func必须标记为@objc ,或者您的class必须标记为@objcMembers


如何获取选择器字符串:

注意:在Swift中创建选择器的首选方法是使用#selector,如his answer中@DavidBerry所述,因为它可以为选择器进行编译时检查。

如果您仍然需要NSSelectorFromString,则这是查找字符串的方法:

@objc添加到函数中并编译项目后,单击ViewController.swift窗口左上方Xcode中的 Related Items 图标,然后选择生成的界面-> <ProjectName>-Swift.h 。在其中,您可以找到func的Objective-C界面:

- (void)testWithValue:(NSInteger)value value2:(NSInteger)value2;

然后将以冒号结尾的部分连接起来以创建选择器字符串:"testWithValue:value2:"