gpt4 book ai didi

Swift 原子 bool 值

转载 作者:搜寻专家 更新时间:2023-11-01 07:32:05 26 4
gpt4 key购买 nike

我正在尝试围绕 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com