gpt4 book ai didi

swift - 为什么可选链接会导致重叠访问错误?

转载 作者:可可西里 更新时间:2023-11-01 00:24:59 24 4
gpt4 key购买 nike

struct someStruct {
var foo: String?
var bar: String?
}

var someOptional: someStruct? = someStruct()

someOptional?.bar = someOptional?.foo

此代码在最后一行导致以下错误。

Overlapping accesses to 'someOptional', but modification requires exclusive access; consider copying to a local variable

如果我用以下内容替换最后一行,那么程序会按预期运行。

let foo = someOptional?.foo
someOptional?.bar = foo

为什么第一个示例会导致错误,为什么替代版本(我认为是相同的)却不会?

最佳答案

结构是值类型,所以当您执行 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

关于swift - 为什么可选链接会导致重叠访问错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57205195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com