NSSelectorFromString在Swift 3中带有命名参数

时间:2016-09-19 23:39:51

标签: swift swift3

在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`

1 个答案:

答案 0 :(得分:4)

在Swift 3中,第一个参数名称是选择器名称的一部分,因此如果第一个参数名称为WithArg,则需要添加arg

child.test("namedChildSelectorWithArg:", "daffodil")