数组 – Swift 3.0:在Array或Dictionary扩展中调用global func min(T,T)时出现编译器错误

数组 – Swift 3.0:在Array或Dictionary扩展中调用global func min(T,T)时出现编译器错误,第1张

概述从 Swift 2.2转换为3.0后,我的Array扩展不再编译,因为它包含对全局标准库函数min< T>(T,T)的调用,并在调用中显示编译器错误额外参数. 这是重现错误的简单方法: extension Array { func smallestInt(first: Int, second: Int) -> Int { return min(first, second) 从 Swift 2.2转换为3.0后,我的Array扩展不再编译,因为它包含对全局标准库函数min< T>(T,T)的调用,并在调用中显示编译器错误额外参数.

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

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

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

看一下Array和Dictionary的文档,我发现Sequence上的实例方法名为public func min() – >元件?和public func min(通过areInIncreasingOrder:(Element,Element)throws – > Bool)重新抛出 – >元件?.虽然String和AudioBuffer都没有任何类型的min(…)函数.

这可能是我无法调用全局函数的原因吗?编译器无法区分全局函数min< T>(T,T)和self.min(…),尽管它们具有完全不同的签名?

这是一个错误还是一个功能?我究竟做错了什么?如何在Array扩展中正确调用min(T,T)?

我认为没有理由为什么编译器不能解析这个函数调用,因此我认为它是一个BUG(它已经被提交 – 见 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    }}

在修复之前,一个简单的解决方案是在调用前加上它所在的模块的名称,以消除歧义,即你指的是顶层函数,而不是实例1.对于标准库,那是Swift:

extension Array {    func smallestInt(first: Int,second: Int) -> Int {        return Swift.min(first,second)    }}

在Swift 4中,编译器对此错误有更好的诊断(尽管它仍然是错误的事实是IMO的错误):

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()    }}

在这种情况下,正如警告所说,你可以通过使用明确的自我来沉默它:

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...    }}
总结

以上是内存溢出为你收集整理的数组 – Swift 3.0:在Array或Dictionary扩展中调用global func min(T,T)时出现编译器错误全部内容,希望文章能够帮你解决数组 – Swift 3.0:在Array或Dictionary扩展中调用global func min(T,T)时出现编译器错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1042047.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存