SyncAccess.swift 714 B

123456789101112131415161718192021222324252627282930313233
  1. import Foundation
  2. @propertyWrapper class SyncAccess<T> {
  3. var wrappedValue: T {
  4. get {
  5. lock.lock()
  6. defer { lock.unlock() }
  7. return value
  8. }
  9. set {
  10. lock.lock()
  11. defer { lock.unlock() }
  12. value = newValue
  13. }
  14. }
  15. var projectedValue: SyncAccess<T> { self }
  16. private var value: T
  17. private let lock: NSRecursiveLock
  18. init(wrappedValue: T) {
  19. value = wrappedValue
  20. lock = NSRecursiveLock()
  21. lock.name = "SyncAccess::\(Unmanaged.passUnretained(self).toOpaque())"
  22. }
  23. init(wrappedValue: T, lock: NSRecursiveLock) {
  24. value = wrappedValue
  25. self.lock = lock
  26. }
  27. }