Swift 3-原子布尔

Swift 3-原子布尔,swift,swift3,boolean,ios10,atomicboolean,Swift,Swift3,Boolean,Ios10,Atomicboolean,有人知道如何在iOS 10中生成原子布尔值吗 当前代码: import UIKit struct AtomicBoolean { fileprivate var val: UInt8 = 0 /// Sets the value, and returns the previous value. /// The test/set is an atomic operation. mutating func testAndSet(_ value: Bool) -&g

有人知道如何在iOS 10中生成原子布尔值吗

当前代码:

import UIKit

struct AtomicBoolean {
    fileprivate var val: UInt8 = 0

    /// Sets the value, and returns the previous value.
    /// The test/set is an atomic operation.
    mutating func testAndSet(_ value: Bool) -> Bool {
       if value {
           return OSAtomicTestAndSet(0, &val)
       } else {
           return OSAtomicTestAndClear(0, &val)
       }
    }

    /// Returns the current value of the boolean.
    /// The value may change before this method returns.
    func test() -> Bool {
      return val != 0
    }
}
代码按预期工作,但我不断收到警告:

'OSAtomicTestAndSet' was deprecated in iOS 10.0: Use atomic_fetch_or_explicit(memory_order_relaxed) from <stdatomic.h> instead
“OSAtomicTestAndSet”在iOS 10.0中被弃用:改为使用原子提取或显式(内存顺序松弛)
我无法让它与原子的fetch或explicit(内存顺序)一起工作

有人知道如何将我当前的代码转换为iOS 10,以消除此警告吗


谢谢大家!

最好的办法是避免。。。如果您想模仿它只是为了同步访问您的AtomicBoolean,请使用GCD中提供的同步

比如说

import PlaygroundSupport
import Foundation
import Dispatch

PlaygroundPage.current.needsIndefiniteExecution = true

let q = DispatchQueue(label: "print")

struct AtomicBoolean {
    private var semaphore = DispatchSemaphore(value: 1)
    private var b: Bool = false
    var val: Bool  {
        get {
            q.async {
                print("try get")
            }
            semaphore.wait()
            let tmp = b
            q.async {
                print("got", tmp)
            }
            semaphore.signal()
            return tmp
        }
        set {
            q.async {
                print("try set", newValue)
            }
            semaphore.wait()
            b = newValue
            q.async {
                print("did", newValue)
            }
            semaphore.signal()
        }
    }

}
var b = AtomicBoolean()

DispatchQueue.concurrentPerform(iterations: 10) { (i) in
    if (i % 4 == 0) {
        _ = b.val
    }
    b.val = (i % 3 == 0)
}
印刷品

try get
try set false
try set false
try set true
did false
got false
try get
try set true
did false
try set false
did true
did true
try set true
try set false
got false
try set false
did false
try get
did true
try set true
did false
did false
got false
try set false
did true
did false

问题的焦点可能应该是如何让
原子\u fetch\u或\u explicit
工作。但要做到这一点,你需要展示你使用它的尝试,并说出失败的原因。比较编译器警告不推荐使用的OSAtomic函数,但不从
导入函数。