Swift中实现类似Objective-C的atomic;
实际上就是在其属性对应的set/get方法中添加锁即可
Swift中实现set/get方法
var _param: Int = 0
var param: Int {
set{
_param = newValue
}
get{
return _param
}
}
如果要添加锁,那么可以使用如下方式:
var _param: Int = 0
var param: Int {
set{
objc_sync_enter(_sdkstate)
_param = newValue
objc_sync_exit(_sdkstate)
}
get{
var result:Int?
objc_sync_enter(_param)
result = _param
objc_sync_exit(_param)
return result ?? 0
}
}
如果每个属性都怎么添加锁的话,代码冗余量会比较大,所以可以抽取一个结构体出来,然后在需要atomic的属性直接使用即可(通过:@propertyWrapper与AtomicValue(default: 0)注解来实现 )
@propertyWrapper
struct AtomicValue<Value> {
private let lock: NSLock
private var value: Value
init(default:Value) {
self.lock = NSLock()
self.value = `default`
}
var wrappedValue: Value {
get{
lock.lock()
defer{ lock.unlock() }
return value
}
set{
lock.lock()
value = newValue
lock.unlock()
}
}
}
在类中定义属性的时候,使用如下写法即可:
@AtomicValue(default:0)
private var paramInt: Int
@AtomicValue(default:"")
private var paramStr: String
网友评论