从 Swift 3.0.1 开始,有4个访问级别,从最高(最不限制的)到最低(最限制的)分别描述如下。
1. open
和 public
允许实体在定义模块(目标)之外使用。通常在为框架指定公共接口时使用open
或public
访问。
然而,open
访问仅适用于类和类成员,与 public
访问不同如下:
public
类和类成员只能在定义模块(目标)内进行子类化和重写。
open
类和类成员可在定义模块(目标)内外进行子类化和重写。
// First.framework – A.swift
open class A {}
// First.framework – B.swift
public class B: A {} // ok
// Second.framework – C.swift
import First
internal class C: A {} // ok
import First
internal class D: B {}
2. internal
internal
允许在定义模块(目标)内使用实体。通常在定义应用程序或框架的内部结构时使用internal
访问。
// First.framework – A.swift
internal struct A {}
// First.framework – B.swift
A() // ok
import First
A()
3. fileprivate
限制实体仅在其定义的源文件中使用。通常,当这些细节在整个文件中使用时,您会使用fileprivate
访问来隐藏特定功能的实现细节。
internal struct A {
fileprivate static let x: Int
}
A.x
// First.framework – B.swift
A.x // error: x is not available
4. private
限制实体只能在其封闭声明中使用。通常在某个功能的实现细节仅在单个声明中使用时,使用private
访问修饰符来隐藏这些细节。
internal struct A {
private static let x: Int
internal static func doSomethingWithX() {
x
}
}
A.x