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.Element
是
Element?
。为通用占位符选择不同的名称
解决问题。
我正在将更大的代码库迁移到 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.Element
是
Element?
。为通用占位符选择不同的名称
解决问题。