Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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 为什么可选链接会导致重叠访问错误? struct someStruct{ var foo:字符串? 变量栏:字符串? } 变量someOptional:someStruct?=someStruct() someOptional?.bar=someOptional?.foo_Swift_Optional - Fatal编程技术网

Swift 为什么可选链接会导致重叠访问错误? struct someStruct{ var foo:字符串? 变量栏:字符串? } 变量someOptional:someStruct?=someStruct() someOptional?.bar=someOptional?.foo

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

此代码导致最后一行出现以下错误

重叠访问“someOptional”,但修改需要独占访问;考虑复制到局部变量

如果我将最后一行替换为以下内容,那么程序将按预期工作

让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
可能重复的