38 lines
		
	
	
		
			679 B
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			679 B
		
	
	
	
		
			Swift
		
	
	
	
	
	
| //
 | |
| //  Atomic.swift
 | |
| //  Broadcast Extension
 | |
| //
 | |
| //  Created by Maksym Shcheglov.
 | |
| //  https://www.onswiftwings.com/posts/atomic-property-wrapper/
 | |
| //
 | |
| 
 | |
| import Foundation
 | |
| 
 | |
| @propertyWrapper
 | |
| struct Atomic<Value> {
 | |
| 
 | |
|     private var value: Value
 | |
|     private let lock = NSLock()
 | |
| 
 | |
|     init(wrappedValue value: Value) {
 | |
|         self.value = value
 | |
|     }
 | |
| 
 | |
|     var wrappedValue: Value {
 | |
|         get { 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
 | |
|     }
 | |
| }
 |