Self在Swift -一个混乱



我一直在Swift Playground中摆弄可变性和自我的概念,并编写了以下代码片段:

var _message = "Outside Message"
struct MyStruct {
var _message  = "Inside Message"
var message: String {
mutating get {
print(_message)
print(self._message)
_message = "New Message for Outside"
self._message = "New Message for Inside"
return self._message
}
}
}
var aStruct = MyStruct()
print("Result: (aStruct.message)")

我得到了输出:

内部消息内部消息

Result: New Message for Inside

我不明白为什么在myStruct中,self没有影响(因为我们似乎总是引用内部_message变量),如果是这样,如何从Message属性中引用外部_message变量?

为什么在myStruct中,self没有影响(因为我们似乎总是引用内部_message变量)

它确实有作用。它表示该结构体的当前实例。"inner"_message实例属性,因此self._message是指它。但在你使用它的上下文中,它是可选的;没有接收者的消息被假定以self作为其接收者。所以在这些情况下,你是否包含或省略它都没有区别;无论如何,您仍然指的是self._message

如何从Message属性中引用外部_message变量

你不能。通过声明具有相同名称的实例属性,遮盖了,有效地切断了您从结构中对它的访问。

"outer"另一方面,变量是全局。它不是任何物体的一部分。因此,它不是命名空间的,如果遮蔽它,就没有办法引用它。这是全球变量不好的众多原因之一。不要使用它们。

Swift中,self是隐式的,scope将设置变量名所指向的优先级。

在你的例子中,你有两个属性叫做_message

在类型MyStruct中,_messageself._message都引用MyStruct的属性。

在结构体内部,没有办法引用外部的_message属性。