我想要一个Sendable
包含闭包的结构。此闭包接受引用类型,但返回Void
,因此Greeter
不直接存储Person
引用。然而,闭包本身仍然是引用。
当前代码:
class Person {
let name: String
init(name: String) {
self.name = name
}
}
struct Greeter: Sendable { // <- Trying to make this Sendable
let greet: (Person) -> Void
init(greeting: String) {
greet = { person in
print("\(greeting), \(person.name)!")
}
}
}
let person = Person(name: "George")
let greeter = Greeter(greeting: "Hello")
greeter.greet(person)
// Hello, George!
在我的实际问题(这是简化的)中,我实际上并不知道Person
它的实现,因此无法标记它Sendable
。它实际上是一个MTLRenderCommandEncoder
,但为简单起见,我们只有Person
.
在greet
定义上,我收到以下警告:
符合“Sendable”的结构“Greeter”的存储属性“greet”具有不可发送类型“(Person)-> Void”
我可以使警告消失,但我认为这不是安全且正确的解决方案:
struct Greeter: Sendable {
let greet: @Sendable (Person) -> Void
init(greeting: String) {
greet = { @Sendable person in
print("\(greeting), \(person.name)!")
}
}
}
如何确保此代码跨线程安全?