私人价值仍然可以从外部访问

SLN*_*SLN 0 scope class swift

我仍然对范围感到困惑,我认为变量只能在其范围内访问,这就是我通常所理解的

class Car {
    let manufacturer: String

    private(set) var color: String

    init() {
        manufacturer = "Ford"
        color = "Black"
    }

    func changeColor(color: String){
        self.color = color
    }
}

var carOfTim = Car()

carOfTim.changeColor("Red") // only "changeColor" fun can update the color
print(carOfTim.color)


//why I can do this?
carOfTim.color = "Green"
print(carOfTim.color) // it prints the "Green"!
Run Code Online (Sandbox Code Playgroud)

问题:我认为私有变量color只能由changeColor函数访问,因为它changeColor具有相同的范围color.但carOfTim.color = "Green"仍然可以更新颜色变量,为什么?

猜猜:因为我使用了Xcode游乐场,所有内容都被输入到相同的普通"终端"中,因此如果我将Car类放入不同的文件夹中,它们可能都具有相同的范围,carOfTim.color = "Green" 可能不再有效.

如果我错了,请纠正我.非常感谢您的时间和帮助.

Jcl*_*Jcl 5

在Swift中,private范围限定为源文件,而不是声明实体.这是一个设计决定.

文档:

专用访问将实体的使用限制在其自己的定义源文件中.使用私有访问隐藏特定功能的实现细节.

...

注意

Swift中的私有访问与大多数其他语言中的私有访问不同,因为它的范围是封闭的源文件而不是封闭的声明.这意味着类型可以访问在与自身相同的源文件中定义的任何私有实体,但如果扩展在单独的源文件中定义,则扩展无法访问该类型的私有成员.

在下面的例子中(粗体是我的):

但是,numberOfEdits属性的访问级别标有private(set)修饰符,表示该属性只能在与 TrackedString结构定义相同的源文件中设置.