准备使用示例在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)
但仍然得到相同的结果。
有关如何解决此问题的任何提示?
答案 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:))