我们如何快速使用 NSSelectorFromString ?

swi*_*nub 1 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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

vac*_*ama 5

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

尝试:

let selector = NSSelectorFromString("testWithValue:value2:")
Run Code Online (Sandbox Code Playgroud)

并且您func必须标有@objc class必须标有@objcMembers


如何获取选择器字符串:

注意:在 Swift 中创建 Selector 的首选方法是使用#selector@DavidBerry 在他的回答中所描述的,因为它为您提供了 Selector 的编译时检查。

如果您仍然需要,NSSelectorFromString那么这是找出字符串的方法:

添加@objc到您的函数并编译项目后,单击窗口左上角的 Xcode 中的相关项图标,ViewController.swift然后选择Generated Interface -><ProjectName>-Swift.h。在那里你会找到你func的 Objective-C 接口:

- (void)testWithValue:(NSInteger)value value2:(NSInteger)value2;
Run Code Online (Sandbox Code Playgroud)

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