toc
- Swift中实现原子属性装饰器
- 原子、非原子属性
- 通过
Property Wrappers
来定义一个原子的属性装饰器
Swift中实现原子属性装饰器
来一篇快文,Property Wrappers
我姑且叫它“属性装饰器”,是Swift 5.1中新增的最关键的功能,本文不深入解释,先了解的可以查看Swift 社区SE-0258提议。
原子、非原子属性
Objective-C
中的属性默认都是原子的(atomic)。原子的意思是,它支持在不同线程安全的读写。非原子的属性,自然就无法确保这些,但是它的优势是可以快速读取属性。
原子的属性,在不同的线程中不一定是同义的(synonymous)
要实现一个原子属性,可以通过锁来实现,在Swift中通过不同的Apple框架的锁都可以实现这点:
通过Property Wrappers
来定义一个原子的属性装饰器
在此使用NSLock
来实现原子属性。
@propertyWrapper
struct Atomic<Value> {
private var value: Value
private let lock = NSLock()
init(wrappedValue value: Value) {
self.value = value
}
var wrappedValue: Value {
get { return load() }
set { store(newValue: newValue) }
}
func load() -> Value {
lock.lock()
defer { lock.unlock() }
return value
}
mutating func store(newValue: Value) {
lock.lock()
defer { lock.unlock() }
value = newValue
}
}
使用的话
代码语言:javascript复制@Atomic var counter: Int = 1