结构是值类型,因此在执行操作时let foo = someOptional?.foo
,的值将someOptional?.foo
被复制到局部变量中foo
。因此,在下一行中,someOptional?.bar = foo
您不再someOptional
有权获取的值foo
,而是直接访问局部变量的值。
这就是为什么someOptional?.bar = someOptional?.foo
不等同于上述解决方案的原因,并且为什么将值保存到局部变量可以解决重叠访问错误。
错误的原因还在于您正在使用值类型。在这一行中,someOptional?.bar = someOptional?.foo
您正在更改的实例属性,someOptional
因此也更改了该实例someOptional
,同时恰好同时访问的另一个实例属性someOptional
。
如果someOptional
是引用类型,则不会出现该错误,请参见下文:
class SomeClass { var foo: NSString? // `NSString` is a reference type var bar: NSString? } let someOptionalClass: SomeClass? = SomeClass() someOptionalClass?.bar = someOptionalClass?.foo let fooRef = someOptionalClass?.foo someOptionalClass?.bar = fooRef