在过去的几个版本中,swift 中的访问修饰符已经收费了几次。现在,让我先建议一个代码示例而不是解释:
一个文件中的所有代码:
fileprivate class Foo {
private var someVariablePrivate: Int?
fileprivate var someVariableFileprivate: Int?
private func makeBar() { }
fileprivate func makeFoo() { }
}
extension Foo {
func bar() {
let value = someVariablePrivate // OK
let value2 = someVariableFileprivate // OK
}
}
private class Foofoo: Foo {
override func makeFoo() {
// OK
}
override func makeBar() {
// NOK, because private
}
}
class Bar {
func foo() {
let object = Foo()
let value = object.someVariableFileprivate // OK
let value2 = object.someVariablePrivate // NOK - because it private to that class
}
}
以前 private 限制只能访问类型定义,但是在 Swift 的几个最新版本中,它已经被修改和更新,所以即使是相同类型的扩展也可以使用私有变量
正如苹果提到的:
文件私有访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些细节时,使用文件私有访问来隐藏特定功能的实现细节。
私有访问将实体的使用限制为封闭声明,以及该声明在同一文件中的扩展。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。
我们可以比较一下这个修饰符:
为什么我们要同时使用它们:
但是,您可能希望将代码的某些部分标记为文件私有或私有,以便在应用程序模块中的其他代码中隐藏它们的实现细节。