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

时间:2016-05-30 19:23:52

标签: swift class scope

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

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"!

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

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

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

1 个答案:

答案 0 :(得分:5)

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

来自the documentation

  

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

...

  

请注意

     

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

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

  

但是,numberOfEdits属性的访问级别标有私有(设置)修饰符,表示该属性只能在同一源文件中设置作为TrackedString结构的定义。