在Objective-C实例数据可以是public,protected或private。例如:
public
protected
private
@interface Foo : NSObject { @public int x; @protected: int y; @private: int z; } -(int) apple; -(int) pear; -(int) banana; @end
在Swift参考中,我还没有提到访问修饰符。是否有可能限制Swift中数据的可见性?
从 Swift 3.0.1开始 ,共有 4级访问权限 ,从最高(最低限制)到最低(最高限制)进行描述。
open
允许在定义模块(目标)之外使用实体。指定框架的公共接口时,通常使用open或public访问。
但是, open 访问权限仅适用于类和类成员,它与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
// Second.framework – D.swift
internal class D: B {} // error: B cannot be subclassed
internal
使实体可以在定义模块(目标)中使用。internal在定义应用程序或框架的内部结构时,通常使用访问权限。
// First.framework – A.swift internal struct A {} // First.framework – B.swift A() // ok // Second.framework – C.swift import First A() // error: A is unavailable
fileprivate
将实体的使用限制在其定义的源文件中。fileprivate当在整个文件中使用特定功能的实现细节时,通常使用访问权限来隐藏这些细节。
// First.framework – A.swift internal struct A { fileprivate static let x: Int } A.x // ok // First.framework – B.swift A.x // error: x is not available
将实体的使用限制在其随附的声明中。private当仅在单个声明中使用特定功能的实现细节时,通常使用访问权限来隐藏这些细节。
// First.framework – A.swift internal struct A { private static let x: Int internal static func doSomethingWithX() { x // ok } } A.x // error: x is unavailable