转义闭包捕获突变';自我';参数(SWIFT 5)

转义闭包捕获突变';自我';参数(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

我试图使用@PropertyRapper创建一个线程安全的结构,但在设置值时,我在操场上遇到了这样一个错误。 只有当我将
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 } }
    }
}