访问控制

参考官方文档

前置知识:模块和源文件

创建一个iOS项目来对比学习

模块
独立的单元构建和发布单位,实现某个特定功能的代码集合
创建的一个项目就是一个模块
import 导入别人的模块(本质是别人写好的项目,直接拿过来用),演示查看UIKIT源代码,导入了很多模块
注意:模块不是目录,更不是文件夹,而是某个功能的集合,比如UIKit、第三方框架(snapkit)等

源文件
是一个模块中的单个 Swift 源代码文件。

访问权限

访问权限可以修饰 类、方法、属性等。

  • open 和 public :允许实体被自己定义的模块中的任意源文件访问,也可以被另一模块的源文件通过导入该定义模块来访问。在指定框架的公共接口时,通常使用 open 或 public。
    【演示】查看UIKIT源代码,里面的方法几乎都是public

  • internal:——不能出模块(项目)
    允许实体被定义模块中的任意源文件访问,但不能被该模块之外的任何源文件访问。通常在定义应用程序或是框架的内部结构时使用。(默认级别)
    【演示】随便创建一个类SecVC,可以在ViewController中访问到。

  • fileprivate——不能出当前源文件
    将实体的使用限制于当前定义源文件中。
    【演示】

   1、新定义一个Woker类,其中fileprivate修饰的name,在另一个文件VC中无法访问
    class Worker{  
          fileprivate var name:String
          override init() {
              self.salary = 6000
              self.name = "miao"
          }
      }
2、在woker类的源文件中新定义一个Company类,可以访问name属性
        class Company{
            var mishu:Worker
            init(mishu:Worker) {
                self.mishu = mishu
            }
            func printInfo(){
                print(mishu.name)  //可访问name
            }
        }
  • private : ——不能出当前作用域
    将实体的使用限制于封闭声明中,比fileprivate更严格。
    【演示】
在woker类的新增属性salary,同文件Company类中也访问不了
   class Worker: {
       
       fileprivate var name:String
       private var salary:Int
       init() {
           self.salary = 6000
           self.name = "miao"
       }
   }

   class Company{
       var mishu:Worker
       init(mishu:Worker) {
           self.mishu = mishu
       }
       func printInfo(){
           print(mishu.name)  //可访问name
           //print(mishu.salary)  //不可访问salary
       }
   }

访问原则

Swift 中的访问级别遵循一个基本原则:实体不能定义在具有更低访问级别(更严格)的实体中。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容