在Objective-C实例中,数据可以是publicprotectedprivate.例如:

@interface Foo : NSObject
{
  @public
    int x;
  @protected:
    int y;
  @private:
    int z;
  }
-(int) apple;
-(int) pear;
-(int) banana;
@end

我在Swift参考中没有发现任何关于访问修饰符的提及.是否可以限制Swift中数据的可见性?

推荐答案

As of Swift 3.0.1, there are 4 levels of access,从最高(最低限制)到最低(最高限制),如下所述.


1. open and public

允许在定义模块(目标)之外使用实体.在指定框架的公共接口时,通常使用openpublic访问权限.

但是,它是100 access applies only to classes and class members,与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

// Second.framework – D.swift

import First

internal class D: B {} // error: B cannot be subclassed

2. internal

允许在定义模块(目标)中使用实体.在定义应用程序或框架的内部 struct 时,通常使用internal access.

// First.framework – A.swift

internal struct A {}

// First.framework – B.swift

A() // ok

// Second.framework – C.swift

import First

A() // error: A is unavailable

3. fileprivate

将实体的使用限制为其定义源文件.当在整个文件中使用特定功能的实现细节时,通常使用fileprivate access来隐藏这些细节.

// 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

4. private

将实体的使用限制为其封闭声明.当特定功能的实现细节仅在单个声明中使用时,通常使用private access来隐藏这些细节.

// First.framework – A.swift

internal struct A {

    private static let x: Int

    internal static func doSomethingWithX() {
        x // ok
    }

}

A.x // error: x is unavailable

Swift相关问答推荐

计算Vision OS相机与Vision OS中3D模型之间的距离

TabView中的视频播放器意外播放

更改正在进行的异步任务的完成(SWIFT并发)(&q;)?

如何在realityKit中反转USDZ动画

在visionOS RealityView中使用.GenerateText时,未显示Reality Composer Promaterial 纹理

将`@Environment`值赋给`Binding`参数

带DispatchSourceTimer的定时器

如何在SWIFT Memory中处理对VAR数组的更新(对COW感到困惑)

为什么我不能在这个 Swift 间接枚举中返回 self ?

快速并行读取进程 standardOutput 和 standardError 而不会阻塞

如何从UIKit中的AttributeContainer获取属性并将其分配给某个变量

使 Swift 并发中的任务串行运行

`IndexSet` 永远不会是空的?

Vapor Swift 如何配置客户端连接超时

Xcode 13.3 将函数调用更改为属性访问

当我必须在 Swift 中的类、 struct 和枚举之间进行 Select 时,我应该如何推理?

在 Swift 中强制崩溃的最简单方法

Alamofire:如何全局处理错误

如何在 Swift 中重写 setter

Swift 中的单元测试致命错误