我正在尝试围绕 iOS OSTestAndSet()
和 OSTestAndClear()
函数创建一个包装器,以便与基于以下 GitHub code 的原子 bool 类型一起使用:
class AtomicBoolean {
private var val: Byte = 0
/// Sets the value, and returns the previous value.
/// The test/set is an atomic operation.
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
}
}
但是,我收到一个关于属性声明的编译器错误:Use of undeclared type 'Byte';您是要使用“UInt8”吗?
目前,我正在为此代码文件导入 Foundation。我已经看到其他 stackoverflow 帖子使用 Byte 类型,但我无法找到为什么这在我的案例中不可用。
我正在使用以下版本的 Swift: Apple Swift 版本 1.2 (swiftlang-602.0.53.1 clang-602.0.53)
此外,如果我按照编译器的建议将数据类型更改为 UInt8,我会在 OSAtomicTestAndSet() 和 OSAtomicTestAndClear() 调用中收到其他错误,这些错误说明如下:无法分配给类型为“UInt8”的不可变值
尽管我使用的是 var
声明而不是 let
。
最佳答案
请注意,此类的实现是伪造的。它设置最高有效位#0,而不是最低有效位#7。这是正确的实现:
public class AtomicBoolean {
private var val: UInt8 = 0
public init(initialValue: Bool) {
self.val = (initialValue == false ? 0 : 1)
}
public func getAndSet(value: Bool) -> Bool {
if value {
return OSAtomicTestAndSet(7, &val)
} else {
return OSAtomicTestAndClear(7, &val)
}
}
public func get() -> Bool {
return val != 0
}
}
还有一个测试来验证:
public class AtomicTest: XCTestCase {
func testSimple() {
let x = AtomicBoolean(initialValue: true)
XCTAssertTrue(x.get())
XCTAssertTrue(x.get())
XCTAssertTrue(x.getAndSet(true))
XCTAssertTrue(x.getAndSet(false))
XCTAssertFalse(x.get())
XCTAssertFalse(x.getAndSet(true))
XCTAssertTrue(x.get())
}
}
关于Swift 原子 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31954537/