转义闭包捕获突变';自我';参数(SWIFT 5)
我试图使用@PropertyRapper创建一个线程安全的结构,但在设置值时,我在操场上遇到了这样一个错误。 只有当我将转义闭包捕获突变';自我';参数(SWIFT 5),swift,swift5,swift-playground,property-wrapper,Swift,Swift5,Swift Playground,Property Wrapper,我试图使用@PropertyRapper创建一个线程安全的结构,但在设置值时,我在操场上遇到了这样一个错误。 只有当我将async更改为sync时,错误才会出现,但我只需要使用async功能 @propertyWrapper struct SafeThread<Value>{ private let queue = DispatchQueue(label: "sellQueue",attributes:.concurrent ) private
async
更改为sync
时,错误才会出现,但我只需要使用async
功能
@propertyWrapper
struct SafeThread<Value>{
private let queue = DispatchQueue(label: "sellQueue",attributes:.concurrent )
private var value: Value
init (wrappedValue: Value){
self.value = wrappedValue;
}
var wrappedValue :Value {
get { queue.sync { value } }
set { queue.async(flags: .barrier) { self.value = newValue } } // there an error
}
}
您需要使用
非交换集
,这样才能为包装值提供外部存储
这是可能的办法。使用Xcode 12/iOS 14进行测试
@propertyWrapper
struct SafeThread<Value>{
private class Storage {
var value: Value
init(initialValue: Value) {
value = initialValue
}
}
private let queue = DispatchQueue(label: "sellQueue",attributes:.concurrent )
private var storage: Storage
init (wrappedValue: Value){
self.storage = Storage(initialValue: wrappedValue);
}
var wrappedValue :Value {
get { queue.sync { self.storage.value } }
nonmutating set { queue.async(flags: .barrier) { self.storage.value = newValue } }
}
}
@propertyWrapper
结构安全线程{
私有类存储{
var值:value
init(initialValue:Value){
值=初始值
}
}
私有let队列=DispatchQueue(标签:“sellQueue”,属性:。并发)
专用var存储:存储
init(wrappedValue:Value){
self.storage=存储(初始值:wrappedValue);
}
var wrappedValue:Value{
获取{queue.sync{self.storage.value}
非交换集{queue.async(标志:.barrier){self.storage.value=newValue}
}
}
@Jessy,不,没有。有一个SWIFT-3问题对我没有帮助没有理由不帮助你;这还不够。你需要发展这方面的技能来帮助你,否则你会在互联网上添加太多的重复内容,这会占用人们的时间。我有一个类似的想法,但这篇文章更好。谢谢你的帖子。
@propertyWrapper
struct SafeThread<Value>{
private class Storage {
var value: Value
init(initialValue: Value) {
value = initialValue
}
}
private let queue = DispatchQueue(label: "sellQueue",attributes:.concurrent )
private var storage: Storage
init (wrappedValue: Value){
self.storage = Storage(initialValue: wrappedValue);
}
var wrappedValue :Value {
get { queue.sync { self.storage.value } }
nonmutating set { queue.async(flags: .barrier) { self.storage.value = newValue } }
}
}