我不明白为什么这总是失败。有什么帮助吗? 显然,我不理解 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) {
}
}
答案 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:"