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/