gpt4 book ai didi

arrays - Swift 3.0 : compiler error when calling global func min(T, T) 数组或字典扩展

转载 作者:行者123 更新时间:2023-11-30 12:42:05 25 4
gpt4 key购买 nike

从 Swift 2.2 转换为 3.0 后,我的 Array扩展不再编译,因为它包含对全局标准库函数 min<T>(T,T) 的调用并显示编译器错误 extra argument in call .

这是重现错误的简单方法:

extension Array {
func smallestInt(first: Int, second: Int) -> Int {
return min(first, second) // compiler error: "Extra argument in call"
}
}

将相同的函数添加到 Dictionary 的扩展名时,我遇到了相同的错误,而完全相同的代码在其他类型的扩展中编译得很好(例如 StringAudioBuffer ):

compiler errors in Array and Dictionary extensions

查看 Array 的文档和Dictionary ,我发现Sequence上有实例方法命名public func min() -> Element?public func min(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> Element? 。而两者StringAudioBuffer没有任何类型的min(...)功能。

难道这就是我无法调用全局函数的原因吗?编译器无法区分全局func min<T>(T,T)self.min(...)尽管他们有完全不同的签名?

这是一个错误还是一个功能?我究竟做错了什么?怎么调用min(T,T)正确地位于 Array 内扩展名?

最佳答案

我认为编译器没有理由无法解析此函数调用,因此我认为它是一个错误(它已被归档 - 请参阅 SR-2450 )。

每当尝试调用具有相同名称但与给定类型(实例或静态)中的相同作用域可访问的方法或属性的签名明显不同的顶级函数时,似乎都会发生这种情况。

一个更简单的例子是:

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 中,编译器可以更好地诊断此错误(尽管在我看来,它仍然是一个错误,但实际上是一个错误):

extension Array {
func smallestInt(first: Int, second: Int) -> Int {
// Use of 'min' refers to instance method 'min(by:)'
// rather than global function 'min' in module 'Swift'
// - Use 'Swift.' to reference the global function in module 'Swift'
return min(first, second)
}
}

尽管有趣的是,编译器现在还会在尝试调用与 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...
}
}

关于arrays - Swift 3.0 : compiler error when calling global func min<T>(T, T) 数组或字典扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42110700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com