在我的swift代码中,我经常使用私有修饰符来限制助手类的可见性。例如,在一个文件中,我将有一个GridController和一个GridControllerModel
应用程序的其余部分应该可以访问GridController(ui),但模型类是完全内部的,不应该被应用程序的其余部分访问。
我可以通过将这两个类设置为private并将它们保存在同一个文件中来迅速解决这个问题。但随着班级的扩大,这变得越来越难处理。我想做的是将每个类保存在一个单独的文件中(为了编程方便),但除了用于信息隐藏目的之外,禁止访问模型类。
有没有什么办法可以用斯威夫特来做这件事?

最佳答案

正如其他人所说,没有办法用迅捷的方式来做你今天想要做的事情。
另一种选择是使用另一个文件中的扩展名将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在今年晚些时候到达时,只需在子类型声明前面添加一个关键字,就可以支持您想要的内容。同时,你也得到了一些你想要的分离。

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

10-12 00:27