我们现在有了一种新的方法来制作惰性变量。在swift-evolution/proposals/0258-property-wrappers.md中有描述:
@propertyWrapper
enum Lazy<Value> {
case uninitialized(() -> Value)
case initialized(Value)
init(wrappedValue: @autoclosure @escaping () -> Value) {
self = .uninitialized(wrappedValue)
}
var wrappedValue: Value {
mutating get {
switch self {
case .uninitialized(let initializer):
let value = initializer()
self = .initialized(value)
return value
case .initialized(let value):
return value
}
}
set {
self = .initialized(newValue)
}
}
}
这是线程安全的实现吗?如果没有,如何重现非线程安全行为?
我有相同的问题,所以我通过编写一个小测试对它进行了测试,该测试在类的一个属性上使用此属性包装器,然后尝试打印该值(自历元以来的时间)异步(10000次),然后在包装值的吸气剂内的“返回值”行上用SIGABRT炸毁。
我也尝试不打印而直接获取价值,而我遇到了同样的问题。
所以我不得不说:不,它不是线程安全的。
编辑:我想补充一点,我在https://www.onswiftwings.com/posts/atomic-property-wrapper/上进行了相同的测试,并且确实是线程安全的,因此您可以将其用作创建线程安全的自己的“惰性”的基础。