Swift Error: 'Sequence' requires the types 'T' and 'ArraySlice<T>' be equivalent
Swift Error: 'Sequence' requires the types 'T' and 'ArraySlice<T>' be equivalent
我正在尝试更新数学库以与 Swift 3 兼容,但我 运行 遇到错误:
'Sequence' requires the types 'T' and 'ArraySlice<T>' be equivalent
Apple 关于 Sequence 的文档建议 makeIterator() 方法 returns 一个迭代器,它确实这样做了。而且似乎迭代器正在返回 grid
变量中的一个元素,该元素是变量 T
。我不太确定我在这里错过了什么。任何意见将是有益的。
public struct Matrix<T> where T: FloatingPoint, T: ExpressibleByFloatLiteral {
public typealias Element = T
let rows: Int
let columns: Int
var grid: [Element]
public init(rows: Int, columns: Int, repeatedValue: Element) {
self.rows = rows
self.columns = columns
self.grid = [Element](repeating: repeatedValue, count: rows * columns)
}
...
}
extension Matrix: Sequence { // <-- getting error here
public func makeIterator() -> AnyIterator<ArraySlice<Element>> {
let endIndex = rows * columns
var nextRowStartIndex = 0
return AnyIterator {
if nextRowStartIndex == endIndex {
return nil
}
let currentRowStartIndex = nextRowStartIndex
nextRowStartIndex += self.columns
return self.grid[currentRowStartIndex..<nextRowStartIndex]
}
}
}
您的代码可以正常编译为 Swift 3.1 (Xcode 8.3.3)。错误
'Sequence' requires the types 'T' and 'ArraySlice<T>' be equivalent
在编译为 Swift 4(Xcode 9,目前是测试版)时发生,因为那时
Sequence
协议已经定义了
associatedtype Element where Self.Element == Self.Iterator.Element
这与您的定义冲突。您可以选择不同的
您的类型别名的名称,或者只是删除它(并使用 T
代替):
public struct Matrix<T> where T: FloatingPoint, T: ExpressibleByFloatLiteral {
let rows: Int
let columns: Int
var grid: [T]
public init(rows: Int, columns: Int, repeatedValue: T) {
self.rows = rows
self.columns = columns
self.grid = [T](repeating: repeatedValue, count: rows * columns)
}
}
extension Matrix: Sequence {
public func makeIterator() -> AnyIterator<ArraySlice<T>> {
let endIndex = rows * columns
var nextRowStartIndex = 0
return AnyIterator {
if nextRowStartIndex == endIndex {
return nil
}
let currentRowStartIndex = nextRowStartIndex
nextRowStartIndex += self.columns
return self.grid[currentRowStartIndex..<nextRowStartIndex]
}
}
}
这会编译并运行 Swift 3 和 4。
我正在尝试更新数学库以与 Swift 3 兼容,但我 运行 遇到错误:
'Sequence' requires the types 'T' and 'ArraySlice<T>' be equivalent
Apple 关于 Sequence 的文档建议 makeIterator() 方法 returns 一个迭代器,它确实这样做了。而且似乎迭代器正在返回 grid
变量中的一个元素,该元素是变量 T
。我不太确定我在这里错过了什么。任何意见将是有益的。
public struct Matrix<T> where T: FloatingPoint, T: ExpressibleByFloatLiteral {
public typealias Element = T
let rows: Int
let columns: Int
var grid: [Element]
public init(rows: Int, columns: Int, repeatedValue: Element) {
self.rows = rows
self.columns = columns
self.grid = [Element](repeating: repeatedValue, count: rows * columns)
}
...
}
extension Matrix: Sequence { // <-- getting error here
public func makeIterator() -> AnyIterator<ArraySlice<Element>> {
let endIndex = rows * columns
var nextRowStartIndex = 0
return AnyIterator {
if nextRowStartIndex == endIndex {
return nil
}
let currentRowStartIndex = nextRowStartIndex
nextRowStartIndex += self.columns
return self.grid[currentRowStartIndex..<nextRowStartIndex]
}
}
}
您的代码可以正常编译为 Swift 3.1 (Xcode 8.3.3)。错误
'Sequence' requires the types 'T' and 'ArraySlice<T>' be equivalent
在编译为 Swift 4(Xcode 9,目前是测试版)时发生,因为那时
Sequence
协议已经定义了
associatedtype Element where Self.Element == Self.Iterator.Element
这与您的定义冲突。您可以选择不同的
您的类型别名的名称,或者只是删除它(并使用 T
代替):
public struct Matrix<T> where T: FloatingPoint, T: ExpressibleByFloatLiteral {
let rows: Int
let columns: Int
var grid: [T]
public init(rows: Int, columns: Int, repeatedValue: T) {
self.rows = rows
self.columns = columns
self.grid = [T](repeating: repeatedValue, count: rows * columns)
}
}
extension Matrix: Sequence {
public func makeIterator() -> AnyIterator<ArraySlice<T>> {
let endIndex = rows * columns
var nextRowStartIndex = 0
return AnyIterator {
if nextRowStartIndex == endIndex {
return nil
}
let currentRowStartIndex = nextRowStartIndex
nextRowStartIndex += self.columns
return self.grid[currentRowStartIndex..<nextRowStartIndex]
}
}
}
这会编译并运行 Swift 3 和 4。