我正在将更大的代码库迁移到 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/