Arrays Swift 3.0:调用全局func min时出现编译器错误<;T>;(T,T)在数组或字典扩展中
从Swift 2.2转换到3.0后,myArrays Swift 3.0:调用全局func min时出现编译器错误<;T>;(T,T)在数组或字典扩展中,arrays,swift,swift3,swift-extensions,Arrays,Swift,Swift3,Swift Extensions,从Swift 2.2转换到3.0后,my数组扩展不再编译,因为它包含对全局标准库函数min(T,T)的调用,并在调用中显示编译器错误额外参数 下面是重现错误的简单方法: extension Array { func smallestInt(first: Int, second: Int) -> Int { return min(first, second) // compiler error: "Extra argument in call" } } 将相
数组
扩展不再编译,因为它包含对全局标准库函数min(T,T)
的调用,并在调用中显示编译器错误额外参数
下面是重现错误的简单方法:
extension Array {
func smallestInt(first: Int, second: Int) -> Int {
return min(first, second) // compiler error: "Extra argument in call"
}
}
将相同的函数添加到字典
的扩展时,我会遇到相同的错误,而在其他类型的扩展中(例如字符串
或音频缓冲区
)完全相同的代码编译得很好:
查看Array
和Dictionary
的文档,我发现Sequence
上有名为public func min()->Element?
和public func min(由areinincreasinorder:(Element,Element)throws->Bool)rethrrows->Element?
的实例方法。而String
和AudioBuffer
都没有任何类型的min(…)
功能
这就是我不能调用全局函数的原因吗?编译器无法区分全局func min(t,t)
和self.min(…)
,尽管它们有完全不同的签名
这是一个bug还是一个特性?我做错了什么?如何在<代码>数组< <代码>扩展> < /p> < p>中正确调用<代码> min(t,t)/代码>?我看不出编译器为什么不能够解析这个函数调用,因此我认为它是一个bug(它已经被归档了)。
每当试图调用具有相同名称但明显不同签名的顶级函数以访问给定类型(实例或静态)中相同作用域的方法或属性时,似乎都会发生这种情况
一个更简单的例子是:
func foo(_ a: Int) {}
struct Foo {
func foo() {} // or static func foo() {}, var foo = 0, static var foo = 0
func bar() {
foo(2) // error: argument passed to call that takes no arguments
}
}
在修复之前,一个简单的解决方案是在调用前加上它所在模块的名称,以消除您所指的是顶级函数而不是实例函数的歧义。对于标准库,这是Swift
:
extension Array {
func smallestInt(first: Int, second: Int) -> Int {
return Swift.min(first, second)
}
}
在Swift 4中,编译器对此错误有更好的诊断(尽管事实上它仍然是一个错误是一个bug):
尽管有趣的是,编译器现在在尝试调用与stdlib顶级函数同名的标准库方法时也会发出警告:
extension Array where Element : Comparable {
func smallest() -> Element? {
// Use of 'min' treated as a reference to instance method in protocol 'Sequence'
// - Use 'self.' to silence this warning
// - Use 'Swift.' to reference the global function
return min()
}
}
在这种情况下,正如警告所说,您可以使用显式的self使其静音。
:
extension Array where Element : Comparable {
func smallest() -> Element? {
return self.min()
}
}
尽管此警告真正令人好奇的是,它似乎没有扩展到非stdlib定义的函数:
func foo(_ a: Int) {}
struct Foo {
func foo() {}
func bar() {
foo() // no warning...
}
}
<> p>我看不出编译器为什么不能解析这个函数调用,因此我认为它是一个bug(它已经被归档了)。
每当试图调用具有相同名称但明显不同签名的顶级函数以访问给定类型(实例或静态)中相同作用域的方法或属性时,似乎都会发生这种情况
一个更简单的例子是:
func foo(_ a: Int) {}
struct Foo {
func foo() {} // or static func foo() {}, var foo = 0, static var foo = 0
func bar() {
foo(2) // error: argument passed to call that takes no arguments
}
}
在修复之前,一个简单的解决方案是在调用前加上它所在模块的名称,以消除您所指的是顶级函数而不是实例函数的歧义。对于标准库,这是Swift
:
extension Array {
func smallestInt(first: Int, second: Int) -> Int {
return Swift.min(first, second)
}
}
在Swift 4中,编译器对此错误有更好的诊断(尽管事实上它仍然是一个错误是一个bug):
尽管有趣的是,编译器现在在尝试调用与stdlib顶级函数同名的标准库方法时也会发出警告:
extension Array where Element : Comparable {
func smallest() -> Element? {
// Use of 'min' treated as a reference to instance method in protocol 'Sequence'
// - Use 'self.' to silence this warning
// - Use 'Swift.' to reference the global function
return min()
}
}
在这种情况下,正如警告所说,您可以使用显式的self使其静音。
:
extension Array where Element : Comparable {
func smallest() -> Element? {
return self.min()
}
}
尽管此警告真正令人好奇的是,它似乎没有扩展到非stdlib定义的函数:
func foo(_ a: Int) {}
struct Foo {
func foo() {}
func bar() {
foo() // no warning...
}
}
正确,哈米什;你赢了我。我立刻意识到了这些症状,因为这与我在这里讨论的问题非常相似:@matt,Hamish:你们当中有人知道操场上的模块名称吗?这里出现了一个问题:。。。。马丁纳问了一个有趣的问题:“那么快速回复怎么样?”!据我所知,操场在运行时会被包装在自己的Cocoa/Cocoa Touch应用程序中,因此,即使您能够计算出模块名称,我怀疑它在同一操场的不同运行中是否稳定。关于REPL,我不知道。也许值得作为正式问题问一下:)@MartinR如果您对Swift 4感兴趣,操场现在有一个模块名操场
(Swift 4现在提供了一个更好的诊断,告诉您要使用的模块名)。尽管对于REPL,诊断给出的模块名称不起作用;你赢了我。我立刻意识到了这些症状,因为这与我在这里讨论的问题非常相似:@matt,Hamish:你们当中有人知道操场上的模块名称吗?这里出现了一个问题:。。。。马丁纳问了一个有趣的问题:“那么快速回复怎么样?”!据我所知,操场在运行时会被包装在自己的Cocoa/Cocoa Touch应用程序中,因此,即使您能够计算出模块名称,我怀疑它在同一操场的不同运行中是否稳定。关于REPL,我不知道。也许值得作为正式问题问一下:)@MartinR如果您对Swift 4感兴趣,操场现在有一个模块名操场
(Swift 4现在提供了一个更好的诊断,告诉您要使用的模块名)。尽管对于REPL,诊断给出的模块名称不起作用。