【问题标题】:Private value can still be accessed from outside仍然可以从外部访问私有值
【发布时间】:2016-05-30 19:23:51
【问题描述】:

我对范围还是有点迷茫,我认为变量只能在其范围内访问,这就是我对一般方式的理解

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" 可能不再工作了。

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

【问题讨论】:

    标签: swift class scope


    【解决方案1】:

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

    来自the documentation

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

    ...

    注意

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2012-10-01
      • 2013-07-11
      • 2011-05-23
      相关资源
      最近更新 更多