在 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