Swift 为什么可选链接会导致重叠访问错误? struct someStruct{ var foo:字符串? 变量栏:字符串? } 变量someOptional:someStruct?=someStruct() someOptional?.bar=someOptional?.foo
此代码导致最后一行出现以下错误 重叠访问“someOptional”,但修改需要独占访问;考虑复制到局部变量 如果我将最后一行替换为以下内容,那么程序将按预期工作Swift 为什么可选链接会导致重叠访问错误? struct someStruct{ var foo:字符串? 变量栏:字符串? } 变量someOptional:someStruct?=someStruct() someOptional?.bar=someOptional?.foo,swift,optional,Swift,Optional,此代码导致最后一行出现以下错误 重叠访问“someOptional”,但修改需要独占访问;考虑复制到局部变量 如果我将最后一行替换为以下内容,那么程序将按预期工作 让foo=someOptional?.foo 一些可选的?.bar=foo 为什么第一个示例会导致错误,为什么备用版本(我假设是相同的)不是?结构是值类型,所以当您执行让foo=someOptional?.foo时,someOptional?.foo的值会复制到局部变量foo。因此,在下一行中,someOptional?.bar=f
让foo=someOptional?.foo
一些可选的?.bar=foo
为什么第一个示例会导致错误,为什么备用版本(我假设是相同的)不是?结构是值类型,所以当您执行
让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
可能重复的