1 2 import Foundation 3 4 @propertyWrapper 5 struct Atomic<Value> { 6 7 private var value: Value 8 private let lock = NSLock() 9 10 init(wrappedValue value: Value) { 11 self.value = value 12 } 13 14 var wrappedValue: Value { 15 get { return load() } 16 set { store(newValue: newValue) } 17 } 18 19 func load() -> Value { 20 lock.lock() 21 defer { lock.unlock() } 22 return value 23 } 24 25 mutating func store(newValue: Value) { 26 lock.lock() 27 defer { lock.unlock() } 28 value = newValue 29 } 30 }