使用选择器

时间:2017-10-02 14:45:23

标签: swift

准备使用示例在Playgrounds中进行测试:

import Foundation

class Demo {

    let selector = #selector(someFunc(_:))

    func someFunc(_ word: String) {
        // Do something
    }

    func someFunc(_ number: Int) {
        // Do something
    }

}

我收到Ambiguous use of 'someFunc'错误。

我已经尝试this回答并得到类似的内容:

let selector = #selector(someFunc(_:) as (String) -> Void)

但仍然得到相同的结果。

有关如何解决此问题的任何提示?

2 个答案:

答案 0 :(得分:2)

简短的回答:它无法完成。

详尽的解释:当您想使用#selector时,需要将这些方法暴露给Objective-C,因此您的代码将变为:

@objc func someFunc(_ word: String) {
    // Do something
}

@objc func someFunc(_ number: Int) {
    // Do something
}

由于@objc注释,它们现在暴露给Objective-C并生成兼容的thunk。 Objective-C可以用它来调用Swift方法。

在Objective-C中,我们不直接调用方法,而是尝试使用objc_msgSend发送消息:编译器无法理解这些方法是不同,因为生成的签名是相同的,所以它不会编译。您将面临错误:

  

方法' someFunc'使用Objective-C选择器' someFunc:'与使用相同Objective-C选择器的先前声明冲突

修复它的唯一方法是使用不同的签名,更改其中一个或两个。

答案 1 :(得分:1)

选择器显然不明确,两种方法都没有外部参数名称。删除空的外部参数以解决此问题:

@objc func someFunc(word: String) {
    // Do something
}

@objc func someFunc(number: Int) {
    // Do something
}

之后,您应该指定一个带参数名称的选择器:

#selector(someFunc(word:))

#selector(someFunc(number:))