如何从过滤器闭包中访问参与者
How to access an actor from within a filter closure
我无法弄清楚如何从过滤器闭包访问参与者。拿这个例子代码:
import Foundation
actor MyActor {
var contents: [String]
init() {
self.contents = []
}
}
let myActor = MyActor()
let list: [String] = []
Task {
list.filter { item in myActor.contents.contains { [=10=] == item } }
}
我收到语法错误:Actor-isolated property 'contents' can not be referenced from a non-isolated context
。这是有道理的,但我就是不知道如何提供正确的语法。
首先将 actor 的内容放入局部 let
常量,然后在 filter
中使用该局部常量:
Task {
let actorContents = await myActor.contents
let result = list.filter { item in actorContents.contains { [=10=] == item } }
}
你不希望 filter
在中途使用更新的 myActor.contents
,如果 myActor.contents
在过滤过程中的某个时刻发生变化,对吧?因此,先在本地复制一份,然后使用它。
此外,考虑使用 Set
以提高效率:
let actorContents = Set(await myActor.contents)
let result = list.filter { item in actorContents.contains(item) }
另一种方法是将过滤例程移到 actor 中:
actor MyActor {
var contents: Set<String> = []
func filtering(_ items: [String]) -> [String] {
items.filter { contents.contains([=10=]) }
}
}
然后,简化调用点:
func foo() {
Task {
let filtered = await myActor.filtering(list)
}
}
这会将同步逻辑移至 actor(它所属的位置,恕我直言)。
我无法弄清楚如何从过滤器闭包访问参与者。拿这个例子代码:
import Foundation
actor MyActor {
var contents: [String]
init() {
self.contents = []
}
}
let myActor = MyActor()
let list: [String] = []
Task {
list.filter { item in myActor.contents.contains { [=10=] == item } }
}
我收到语法错误:Actor-isolated property 'contents' can not be referenced from a non-isolated context
。这是有道理的,但我就是不知道如何提供正确的语法。
首先将 actor 的内容放入局部 let
常量,然后在 filter
中使用该局部常量:
Task {
let actorContents = await myActor.contents
let result = list.filter { item in actorContents.contains { [=10=] == item } }
}
你不希望 filter
在中途使用更新的 myActor.contents
,如果 myActor.contents
在过滤过程中的某个时刻发生变化,对吧?因此,先在本地复制一份,然后使用它。
此外,考虑使用 Set
以提高效率:
let actorContents = Set(await myActor.contents)
let result = list.filter { item in actorContents.contains(item) }
另一种方法是将过滤例程移到 actor 中:
actor MyActor {
var contents: Set<String> = []
func filtering(_ items: [String]) -> [String] {
items.filter { contents.contains([=10=]) }
}
}
然后,简化调用点:
func foo() {
Task {
let filtered = await myActor.filtering(list)
}
}
这会将同步逻辑移至 actor(它所属的位置,恕我直言)。