带有可选数组的 Swift 4 自定义通用结构表现得很奇怪?

标签 swift generics swift4

我正在将更大的代码库迁移到 Swift 4。它包括一个实现矩阵的自定义类型。在 Swift 3.1 中,一切都按预期运行良好。

我能够将问题简化为两个小代码块。第一个定义结构:

struct Matrix<Element> {
    var array:[Element?] = []

    mutating func setup(repeatedValue:Element) {
        let fooTemp = Array<Element?>(repeating: repeatedValue, count: 10)
        self.array = fooTemp
    }
}

当我添加 Sequence 时,问题本身就出现了实现:

extension Matrix: Sequence {
    typealias Iterator = AnyIterator<Element?>

    func makeIterator() -> Iterator {
        return AnyIterator(array.makeIterator())
    }
}

一旦Sequence实现是代码的一部分,我在 self.array = fooTemp 行中收到编译器错误:

Cannot assign value of type '[Element??]' to type '[_?]'

我知道,我可以使用 let fooTemp = Array<Element> 解决此问题在代码中。类型推断不尊重这一点,并使 fooTemp 成为 Array<Element?>

这是怎么回事?编译器恶作剧?

该问题也出现在 Swift 3.2 中。

最佳答案

Sequence 协议(protocol)定义

/// A type that provides the sequence's iteration interface and
/// encapsulates its iteration state.
associatedtype Element where Self.Element == Self.Iterator.Element

这会导致冲突,因为您的 Self.Iterator.Element元素?。为通用占位符选择不同的名称 解决了问题。

关于带有可选数组的 Swift 4 自定义通用结构表现得很奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45148587/

相关文章:

ios - Swift 4 尝试呈现其 View 不在窗口层次结构中的 ViewController

ios - 无法快速验证添加的行 TableView 文本字段

ios - 在 Realm 中存储值

java - 为什么这个通用方法没有给出编译时错误?

json - 可编码的 Swift JSON 解析嵌套的 JSON

swift - 如何在 Swift 中解包任意深度嵌套的可选值?

json - 如何使用 swift 4.1 codable(json 解码)过滤无效数据

swift - XCTAssertNotNil 在 Swift 2 中什么都不做

javascript - 是否可以仅针对 typescript 上的特定类型扩展 Array.prototype ?

c# - 什么时候在 C# 中使用字典?