1.open 这是权限最大的,只要用它来修饰的变量(类),整个项目都能访问,并且支持所有编译器允许的操作,不过只有类可以用这个来修饰变量,结构体会报下图的错误,拿第三方库比喻的话,就是封装在最外层的类
2.public 允许本模块的所有操作,不允许被其它模块继承和重写,基本是最常用的权限
3.internal 在public的基础上,只允许本模块访问
4.fileprivate 只允许在当前的文件内访问比如main.m里面用fileprivate定义了一个类,那就只能main.m文件的其它类或者什么能访问
5.private 只允许封闭的实体里面访问,比如这图,在外面访问就直接报错了
访问规则
1.变量的访问类型的权限要大于变量的权限
比如这代码没啥问题,原因就是var的权限Public要大于internal,原因很简单,如果允许这样访问,我创建一个private的意义就没有了,用open修饰一个Person实例,所有地方都能访问这个Person了
图上左边的类型访问权限是大于等于右边,比如
父类指针可以指向子类对象,而子类对象无法指向父类对象,就不一一验证了
如果在元组这类多个对象,多个访问权限的时候,必须小于最小的
总结:左边的权限必须小于等于右边,多个的情况下,必须小于等于右边权限最小的
嵌套的权限问题
这段代码来说,报错很正常,父类的权限要比子类小,就是所谓的,左边权限大于右边所以不可以
private class Person {}
fileprivate class Stu:Person {}
但单独拿出来放在main.m则可以了,原因是嵌套的问题,当有了嵌套之后private的权限就只限于这个嵌套范围了,所以Person的权限只能在test里面访问,但拿出来之后Person和Stu的访问权限都是main.m可用,所以是同等权限