Swift Array()强制模棱两可,没有更多上下文,但仅在扩展中

马特

可以这样说(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目前具有一项功能,您可以在自己的主体内引用泛型类型而不必重复其占位符类型-编译器会为您推断出它们与的类型相同self

例如:

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(_:)完全避免问题,而不是调用的Initializer

extension Array {
  func f() {
    let arrenum = self.enumerated().map { $0 }
  }
}

就像初始化程序调用一样,它将给您返回一组偏移量元素对。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Swift 中没有更多上下文错误的模棱两可

表达式的类型是模棱两可的,在Swift 3中没有更多上下文

在 swift 中,如果没有更多上下文,表达式类型是模棱两可的?

Swift 3.0:如果没有更多上下文,表达式的类型是否模棱两可?

Swift 5 结果:XCTAssertEqual 在没有更多上下文的情况下是模棱两可的

Swift表达式错误(模棱两可,无需更多上下文)

在 swift source 中,表达式的类型是模棱两可的,没有更多的上下文

Swift 2.0:在没有更多上下文的情况下,表达式的类型是否模棱两可?SortInPlace

Swift 2.0:在没有更多上下文的情况下,表达式的类型是否模棱两可?

Swift 4 - 表达式类型'@lvalue String?' 在没有更多上下文的情况下是模棱两可的

三元运算中的“表达类型'布尔'是模棱两可的,没有更多上下文”

在HealthKit HKStatisticsQuery中收到“错误的表达类型是模棱两可的,没有更多上下文”

表达式类型'()'在没有更多上下文的情况下是模棱两可的

“表达式的类型是模棱两可的,没有更多上下文”-引用appDelegate

泛型函数参数,给出“表达类型是模棱两可的,没有更多上下文”

表达式类型“ DataRequest”是模棱两可的,没有更多上下文

蒸气加密:表达式类型“数据”是模棱两可的,没有更多上下文

在Alamofire中没有更多上下文的情况下表达类型是模棱两可的。uploadswift 3

表达式的类型是模棱两可的,在`ForEach`中没有自定义类数组的更多上下文

在Swift中-表达式类型不明确,没有更多上下文

表达式类型 '@lvalue String?' 在没有更多上下文的情况下是模棱两可的

为什么会出现错误“表达式类型在没有更多上下文的情况下是模棱两可的”?

使用VTCompressionSessionEncodeFrame时,如何在没有更多上下文的情况下解决“ OSStatus”是模棱两可的

pattern.firstMatch 是获取错误:表达式类型 '@lvalue String?' 在没有更多上下文的情况下是模棱两可的

SwiftUI Picker选择参数给出“表达式类型'Binding <_>'是模棱两可的,没有更多上下文”错误

在使用解密时,表达式类型是模棱两可的,没有使用AES的更多上下文

比较 Swift 中的两个双打:“没有更多上下文,表达式类型是不明确的”

Swift闭包中的“表达式类型不明确,没有更多上下文”

在 Swift3 中没有更多上下文的表达式类型不明确