在我的 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/