为什么Swift允许在同一个文件中访问私有变量?

All*_*eng 7 encapsulation swift

我刚刚发现Swift的private访问修饰符是文件级别,如"访问级别"下的文档中所规定的:

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

所以这意味着当类型在同一个文件中时,下面的代码将被编译:

class FirstType {
    private var privateProperty: String = ""
}

class SecondType {
    private let firstType = FirstType()

    func messWithFirstType() {
        firstType.privateProperty = "" // this compiles and works!
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所见,这完全破坏了封装.另一方面,为了便于阅读,将一些相关类型组合在同一个文件中可能会很好,特别是如果相关类型很小,如枚举.

私有扩展是一个例外,因为它们扩展了文件要包含的相同类型.私有扩展确实带来了一些不错的东西.

除了促进私有扩展之外,还有任何其他原因使文件范围private访问修饰符在Swift中吗?

mat*_*att 7

我不清楚为什么private最初是针对文件实现的,但请放心,Swift人知道这不是唯一可能的含义,private并且它不适合某些目的,并且正在努力改变它.桌面上已经有一个提议,接受Swift 3,它将把当前的内容private转换为fileprivate并添加一个新的级别,private该级别将限定为类型而不是文件.您可以期待在不久的将来看到它成为Swift 3的一部分.

  • 在Swift 3.0中完成:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID3 (2认同)