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跳过赋值。然后保持你的代码不变。虽然很酷,但我认为这会使以后的维护变得很困难