如何用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
相关产品推荐
相关产品推荐

