仅当变量的当前值为非零时才更改变量

时间:2018-08-13 01:55:36

标签: swift optional

使变量或对象属性保持相同的最佳方法是什么,但是如果不存在,则设置默认值。

我目前正在做

optionalVar = optionalVar ?? defaultValue

但是,有时会出现类似以下错误:

Thread 1: Simultaneous accesses to 0x103a854b8, but modification requires exclusive access

有时我不这样做,所以我不认为这是最好的方法。

2 个答案:

答案 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"