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

标签 swift option-type

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/

相关文章:

ios - 发送带有字符串的后请求

swift - SKSpriteNode 名称为 int

swift - 为什么可选常量不会自动具有默认值 nil

Swift:无法将类型 'Int?' 的值转换为指定类型 'UInt32'

swift - SceneKit切换场景内存泄漏

ios - 为什么我的完成键没有退出键盘?

Swift 解包可选类变量产生失败

Java - 检查数字是否为 Not Null,否则分配默认字符串值

swift - 为什么不能在以下示例中使用结构的常量属性

ios - 在 firebase 的字典中更新单个值 - Swift 项目