2016-05-30 54 views
0

我仍然有点困惑范围访问,我觉得变量只能在其范围内进行访问,这就是我在一般的方式私人值仍然可以从外部

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的操场上,一切都被输入到同一平面“终端”,因此所有的人都可能具有相同的范围,如果我把车类转换成不同的文件夹,carOfTim.color = "Green"不得工作了。

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

回答

5

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

the documentation

私人接入限制使用的实体自身的定义源文件。使用私人访问来隐藏特定功能的实现细节。

...

注意

斯威夫特私接不同于大多数其他语言的私人通道,因为它的作用范围是封闭源文件,而不是封闭的声明。这意味着一个类型可以访问与自己相同的源文件中定义的任何私有实体,但是如果扩展在单独的源文件中定义,则该扩展无法访问该类型的私有成员。

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

然而,对于numberOfEdits属性的访问级别标有私人间(套)修改,以表明的属性应只能在跟TrackedString结构的定义相同的源文件内设置。

+0

非常感谢您的回答和参考 – SLN

相关问题