【问题标题】:Why does optional chaining cause an overlapping accesses error?为什么可选链接会导致重叠访问错误?
【发布时间】:2019-07-25 15:08:37
【问题描述】:
struct someStruct {
    var foo: String?
    var bar: String?
}

var someOptional: someStruct? = someStruct()

someOptional?.bar = someOptional?.foo

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

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

如果我将最后一行替换为以下内容,则程序按预期运行。

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

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

【问题讨论】:

标签: swift optional


【解决方案1】:

结构是值类型,所以当你做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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-22
    • 2015-06-29
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多