正如其他人所说,没有办法在 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 的 子类型 来实现一些分离,但这并不是真正的访问控制。从好的方面来说,它不会在 GridController 类之外的代码完成中显示为“GridControllerModel”,您需要先键入“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
}
}
(注意上面的“local”关键字)。这将使 GridControllerModel 类型对除 GridController 和 GridController 的任何扩展之外的所有类不可见且不可访问。
所以,我建议你今天考虑这种嵌套子类型方法,因为当 Swift 3.0 在今年晚些时候到来时,它很可能通过在你的子类型声明前添加一个关键字来支持你想要的东西。同时,你也得到了一些你想要的分离。