大佬教程收集整理的这篇文章主要介绍了数组 – Swift数组()强制模糊,没有更多上下文 – 但仅限于扩展,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
let arrenum = Array(arr.enumerated())
那么为什么说这个不合法呢?
extension Array { func f() { let arrenum = Array(self.enumerated()) // error: type of expression is ambiguous without more context } }
extension Array { func f() { typealias Tup = (offset:Index,element:Element) let arrenum = Array<Tup>(self.enumerated()) } }
但为什么需要呢? (是不是?)
例如:
struct S<T> { func foo(_ other: S) { // parameter inferred to be `S<T>`. let x = S() // `x` inferred to be `S<T>`. } } extension S { func bar(_ other: S) {} // same in extensions too. }
这很方便,但是你遇到的错误是Swift总是会做出这个推断,即使它是不正确的.
所以,在你的例子中:
extension Array { func f() { let arrenum = Array(self.enumerated()) // error: type of expression is ambiguous without more context } }
Swift将代码解释为let arrenum = Array< Element>(self.enumerated()),因为你在Array< Element>的主体中.这是不正确的,因为enumerated()产生一系列偏移元素元组对 – Swift应该推断出Array为Array<(offset:Int,element:Element)>代替.
您已经发现的一种解决方法是显式指定占位符类型,以防止编译器进行此错误推理.
extension Array { func f() { let arrenum = Array<(offset: Int,element: Element)>(self.enumerated()) } }
另一种可能的解决方法似乎是使用完全限定类型,例如:
extension Array { func f() { let arrenum = Swift.Array(self.enumerated()) } }
因为看起来Swift并没有对完全限定类型做同样的推断(我不确定你是否应该依赖这个事实).
最后值得注意的是,不是调用Array的初始化器,而是使用map(_ :)代替完全避免这个问题:
extension Array { func f() { let arrenum = self.enumerated().map { $0 } } }
以上是大佬教程为你收集整理的数组 – Swift数组()强制模糊,没有更多上下文 – 但仅限于扩展全部内容,希望文章能够帮你解决数组 – Swift数组()强制模糊,没有更多上下文 – 但仅限于扩展所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。