【发布时间】:2021-10-14 04:43:42
【问题描述】:
如何使参与者符合Sequence 协议?以下代码生成编译器警告:
与全局actor 'MainActor' 隔离的实例方法'makeIterator()' 不能满足协议'Sequence' 的相应要求
@MainActor class Test: Sequence {
private var contents: [Int] = []
func makeIterator() -> Array<Int>.Iterator {
contents.makeIterator()
}
}
【问题讨论】:
-
我不相信Actor可以符合Sequence。它的值不能在没有等待的情况下访问,这是 Sequence 所要求的。您应该能够使其符合 AsyncSequence。
-
我的实际目标是符合
RandomAccessCollection。我曾希望从符合Sequence开始,这将是帮助我学习的一个很好的步骤,但我意识到 Swift 并发在多大程度上颠覆了我的理解。 -
同样的事情; Actor 不能符合 RandomAccessCollection。这将特别成问题,因为
count和元素可能会在调用者的背后发生变化。 (如果内容是不可变的,那么它是一个 Actor 是没有意义的。)相反,Actor 应该将其内容作为属性/方法提供。例如,let elements = await actor.elements。那么elements将是某个时间点 Actor 内容的快照,它肯定符合 RandomAccessCollection。 -
@RobNapier 只要将所需的方法标记为
nonisolated,参与者仍然可以符合Sequence(或任何非异步协议,例如Hashable)。当然,您将无法访问任何与参与者隔离的属性,这意味着参与者可能不适合Sequence。AsyncSequence更适合演员
标签: swift concurrency swift-concurrency