使变量或对象属性保持相同的最佳方法是什么,但是如果不存在,则设置默认值。
我目前正在做
optionalVar = optionalVar ?? defaultValue
但是,有时会出现类似以下错误:
Thread 1: Simultaneous accesses to 0x103a854b8, but modification requires exclusive access
有时我不这样做,所以我不认为这是最好的方法。
答案 0 :(得分:0)
输入类似您的声明
x = x ?? y
将始终导致分配,您将重新分配相同的值或分配新的值y。如您在多个线程上尝试执行此操作时所经历的那样,偶尔会有多个线程同时访问该变量。
您可能希望使用更长的逻辑形式:
if optionalVar == nil {
optionalVal = default
}
不太漂亮,但是如果已经定义了值,则不会重新分配它。另外,您可以使用Mutex / NSLock来确保一次仅一个线程可以为此变量设置一个值。
答案 1 :(得分:0)
如果您认为使用if语句太“丑陋”,则始终可以使用自定义运算符将其包装起来:
infix operator =?
func =?<T>(left: inout T?, right: T?) {
if left == nil {
left = right
}
}
var str: String? = nil
str =? "Hello"
str =? "Bye" // "str" is still "Hello"