在Swift 2.3中,我可以使用NSSelectorFromString("methodWithArg:")
动态调用已命名参数的方法。在Swift 3中,我必须在_
前加上一个命名参数,以允许在没有名称的情况下调用它。
这还有可能吗?有关测试用例,请参阅此游乐场代码。
class Parent : NSObject {
func parentSelector(_ arg: String) {
print(" ---> Selected: \(arg)")
}
func test(_ selectorString: String, _ printString: String) {
let selector : Selector = NSSelectorFromString(selectorString)
// if self.responds(to: selector) {
self.perform(selector, with: printString)
// }
}
}
class Child : Parent {
func childSelector(_ arg: String) {
print(" ---> Child selected: \(arg)")
}
func namedChildSelector(arg: String) {
print(" ---> Child selected: \(arg)")
}
}
let parent = Parent()
parent.test("parentSelector:", "apple") // Works
let child = Child()
child.test("parentSelector:", "banana") // Works
child.test("childSelector:", "coffee") // Works
child.test("namedChildSelector:", "daffodil") // Throws `NSInvalidArgumentException`
child.test("namedChildSelector(_:)", "daffodil") // Throws `NSInvalidArgumentException`
答案 0 :(得分:4)
在Swift 3中,第一个参数名称是选择器名称的一部分,因此如果第一个参数名称为WithArg
,则需要添加arg
:
child.test("namedChildSelectorWithArg:", "daffodil")