数组 – Swift数组()强制模糊,没有更多上下文 – 但仅限于扩展
发布时间:2020-12-14 04:40:45 所属栏目:百科 来源:网络整理
导读:这是合法的(arr是一个数组): let arrenum = Array(arr.enumerated()) 那么为什么说这个不合法呢? extension Array { func f() { let arrenum = Array(self.enumerated()) // error: type of expression is ambiguous without more context }} 编辑似乎这是
这是合法的(arr是一个数组):
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()) } } 但为什么需要呢? (是不是?) 解决方法
这是一个已知的错误(
SR-1789). Swift目前有一个功能,您可以在其自己的主体中引用泛型类型,而不必重复其占位符类型 – 编译器将推断它们与您自己的类型相同.
例如: 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 } } } 与初始化调用一样,它将返回一组偏移元素对. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |