Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 仅当变量为';s的当前值为非零_Swift_Optional - Fatal编程技术网

Swift 仅当变量为';s的当前值为非零

Swift 仅当变量为';s的当前值为非零,swift,optional,Swift,Optional,保持变量或对象属性不变的最佳方法是什么,但如果它不存在,请设置默认值 我目前: optionalVar = optionalVar ?? defaultValue 但是,有时会出现如下错误: Thread 1: Simultaneous accesses to 0x103a854b8, but modification requires exclusive access 有时我不这么认为,所以我不认为这是最好的方法。像您这样输入语句: x = x ?? y 将始终导致赋值,您可以重新指定相

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

我目前:

optionalVar = optionalVar ?? defaultValue
但是,有时会出现如下错误:

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

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

像您这样输入语句:

x = x ?? y
将始终导致赋值,您可以重新指定相同的值,也可以指定新的值y。正如您在尝试对多个线程执行此操作时所经历的那样,偶尔会有多个线程同时访问该变量

您可能希望使用更长的逻辑形式:

if optionalVar == nil {
  optionalVal = default
}

没有那么漂亮,但是如果已经定义了该值,则不会重新分配该值。或者,您可以使用互斥锁/NSLock来确保一次只有一个线程可以为此变量设置值。

如果您认为使用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"
中缀运算符=?
func=?(左:输入T?,右:T?){
如果左=零{
左=右
}
}
var str:String?=无
str=?“你好”
str=?“Bye”/“str”仍然是“Hello”

好的,我已经知道了,但这是我希望避免的更丑陋的方法。您可以始终为optionalVar创建一个getter,如果为nil,则返回默认值,或者在实例化变量后立即定义一个默认值,如果值相同,甚至可以创建一个自定义setter跳过赋值。然后保持你的代码不变。虽然很酷,但我认为这会使以后的维护变得很困难