You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Swift参数包实现可变参数ZipSequence类型?

解决方案

要解决这个编译错误,核心是让迭代器的next()方法(mutating方法)能修改原迭代器实例,而非操作它的不可变副本。你需要在repeat表达式中使用inout模式绑定迭代器:

struct ZipSequence<each S: Sequence>: Sequence where each S.Element: Sendable {
    typealias Element = (repeat each S.Element)
    var sequences: (repeat each S)
    
    func makeIterator() -> ZipIterator<repeat each S> {
        ZipIterator(iterators: (repeat each sequences.makeIterator()))
    }
}

struct ZipIterator<each S: Sequence>: IteratorProtocol {
    typealias Element = (repeat each S.Element)
    var iterators: (repeat each S.Iterator)
    
    mutating func next() -> Element? {
        // 使用inout模式(&)允许修改原迭代器
        return (repeat (each &iterators).next()!)
    }
}

关键说明

原代码报错是因为(each iter)拿到的是iterators中每个元素的不可变副本,而next()是mutating方法,无法在不可变值上调用。通过(each &iterators),我们将每个迭代器以inout方式传递,这样就能调用其mutating的next()方法并修改原迭代器的状态。

内容的提问来源于stack exchange,提问作者Sweeper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:15:57