Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用选择器时引用不明确_Swift - Fatal编程技术网

Swift 使用选择器时引用不明确

Swift 使用选择器时引用不明确,swift,Swift,准备使用示例在操场进行测试: 导入基础 课堂演示{ 让选择器=#选择器(someFunc(35;:)) func someFunc(uword:String){ //做点什么 } func someFunc(u编号:Int){ //做点什么 } } “someFunc”的用法模棱两可,出现了一个错误 我试着回答,得到了如下结果: let selector=#selector(someFunc(:)as(String)->Void) 但仍然得到同样的结果 关于如何解决此问题的任何提示?选择器显

准备使用示例在操场进行测试:

<代码>导入基础 课堂演示{ 让选择器=#选择器(someFunc(35;:)) func someFunc(uword:String){ //做点什么 } func someFunc(u编号:Int){ //做点什么 } } “someFunc”的用法模棱两可,出现了一个
错误

我试着回答,得到了如下结果:

let selector=#selector(someFunc(:)as(String)->Void)
但仍然得到同样的结果


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

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

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

@objc func someFunc(number: Int) {
    // Do something
}
之后,应使用参数名称指定选择器:

#selector(someFunc(word:))


简单回答:这是不可能的

详细说明:如果要使用
#选择器
,则需要将方法公开给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
发送消息:编译器无法理解这些方法是不同的,因为生成的签名是相同的,所以它不会编译。您将面临以下错误:

具有Objective-C选择器“someFunc:”的方法“someFunc”与具有相同Objective-C选择器的上一个声明冲突


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

您可以删除
,因此它是
someFunc(word:String)
和put
#选择器(someFunc(word:)
问题是选择器是obj-c特性,obj-c无法根据类型区分方法。选择器本质上只是字符串
“someFunc:”
#selector
语法只是编译时验证。您需要将方法公开给Obj-C(通过使用
@objc
),以便使用
#selector
,此时编译器将指出下一个问题,正如Sulthan所说,这两个方法都有相同的选择器。您需要为其中一个指定一个不同的选择器,或者更改签名,或者为其提供自定义的Obj-C名称。
@objc
并不意味着消息分派;这就是你所想的
dynamic
@objc
只生成一个与Obj-C兼容的thunk,然后Obj-C可以使用它调用Swift方法。Swift仍将使用表分派调用该方法(默认情况下不是消息分派),或者在某些情况下使用静态分派,例如使用
private
final
方法。感谢您的回复,答案可能不够清楚。如果我错了,请告诉我:1)objc生成与objective-c兼容的thunk,可以通过Swift方法将其用作入口点。它们是使用objc_msgSend调用的,这就是问题代码的问题所在(我试图回答这个问题)。2) 一旦我们“进入”Swift,它将使用内联、静态、虚拟或动态调度调用方法:选择的方法总是最快的方法。对于dynamic,我们只是强迫Swift始终使用第四个选项。我试图回答1),而不是2)。我错过什么了吗?:)@MarcoPace AFAIK Swift不会使用消息分派,除非方法被特别标记为
动态
;但你完全正确。我只是认为您应该更改“编译器不会直接调用方法,而是尝试使用
objc\u msgSend
发送消息”的措辞,因为这对于Swift编译器是不正确的(同样,除非
dynamic
)。这对Obj-C tho来说是正确的。
@objc func someFunc(_ word: String) {
    // Do something
}

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