Swift:访问级别在 `private` 和 `internal` 之间?

标签 swift oop access-modifiers information-hiding

在我的 Swift 代码中,我经常使用 private 修饰符来限制辅助类的可见性。例如,在一个文件中,我将有一个 GridController 和一个 GridControllerModel

GridController(UI)应该可供应用程序的其余部分访问,但模型类完全是内部的,应用程序的其余部分永远不应访问。

我可以在 Swift 中解决这个问题,方法是将两个类设为 private 并将它们保存在同一个文件中。但是随着类(class)越来越大,这会变得笨拙。我想做的是将每个类保存在一个单独的文件中(为了编程方便),但阻止访问模型类,除了 GridController(为了信息隐藏目的)。

在 Swift 中有什么方法可以做到这一点吗?

最佳答案

正如其他人所说,目前无法在 Swift 中完全按照您的意愿行事。

一种替代方法是在另一个文件中使用扩展来添加 GridControllerModel 作为 GridController 的嵌套子类型。例如

//GridControllerModel.swift

extension GridController {
    struct GridControllerModel {
        let propertyOne:String
        let propertyTwo:String
    }
}

这允许您的 GridController 类在其自己的单独文件中声明如下内容:

var model = GridControllerModel()

但是,应用程序的其余部分仍然可以像这样访问 GridControllerModel 类型:

//SomeOtherClass.swift

var nested = GridController.GridControllerModel()

因此,您确实通过使模型类型成为 GridController 的子类型 实现了一些分离,但这不是真正的访问控制。从好的方面来说,它不会作为“GridControllerModel”出现在 GridController 类之外的代码完成中,您需要先键入“GridController”,然后再键入“。”查看子类型“GridController.GridControllerModel”

还值得注意的是,额外的访问控制级别目前正在审查中,并且可能会出现在下一版本的 Swift (3.0) 中:

https://github.com/apple/swift-evolution/blob/master/proposals/0025-scoped-access-level.md

假设该提议被接受并实现,您将能够像这样更新声明的子类型:

//GridControllerModel.swift

local extension GridController {
    struct GridControllerModel {
        let propertyOne:String
        let propertyTwo:String
    }
}

(现在请注意上面的“本地”关键字)。这将使 GridControllerModel 类型对除 GridController 和 GridController 的任何扩展之外的所有类不可见和不可访问。

因此,我建议您今天考虑这种嵌套子类型方法,因为当 Swift 3.0 在今年晚些时候发布时,它很可能只需在您的子类型声明前添加一个关键字即可支持您想要的功能。同时,您还可以获得一些您想要的分离效果。

关于Swift:访问级别在 `private` 和 `internal` 之间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36161858/

相关文章:

ios - 在 UITableViewCell 返回 View 后,NSManagedObject 数据为 <fault> 且实体为空

c++ - 如何从 C 文件调用 C++ 构造函数

java - 了解 Java 的 protected 修饰符

java - protected 和默认修饰符 Java

json - 拿到Alamofire的返回数据后下一步该怎么办?

ios - 使用 AVMutableCompositionTrack 合并 AVMutableComposition 中的视频和图像,而不是 AVVideoCompositionCoreAnimationTool?

ios - 如何根据图像类别从 firebase 存储中检索图像(例如汽车、抽象)

java - 我应该对 bean 使用继承吗?

php - 了解在 OOP 中返回和传递自定义对象的目的

c# - 静态、内部和公共(public)构造函数之间有什么区别?