- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!