Swift 4 带有可选数组的自定义泛型结构表现奇怪?

Swift 4 custom generic struct with optional array behaves strange?

我正在将更大的代码库迁移到 Swift4。它包括一个实现矩阵的自定义类型。在 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 协议定义

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

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