加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift Error:’Sequence’要求类型’T’和’ArraySlice’是等价

发布时间:2020-12-14 04:40:36 所属栏目:百科 来源:网络整理
导读:我正在尝试更新数学库以与 Swift 3兼容,但我遇到了一个错误: ‘序列’需要类型’T’和’ArraySlice T‘相当于 关于Sequence的Apple文档建议makeIterator()方法返回一个迭代器.似乎迭代器在网格变量中返回一个元素,它是变量T.我不太确定我在这里缺少什么.任
我正在尝试更新数学库以与 Swift 3兼容,但我遇到了一个错误:

‘序列’需要类型’T’和’ArraySlice< T>‘相当于

关于Sequence的Apple文档建议makeIterator()方法返回一个迭代器.似乎迭代器在网格变量中返回一个元素,它是变量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,目前为beta)时,会发生这种情况
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,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一起编译和运行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读