一、前言
swift中由低至高提供了 private,fileprivate,internal,public 和 open 五种访问控制的权限。默认的internal在绝大部分时候是适用的。
对于一个严格的项目来说,精确的最小化访问控制级别对于代码的维护来说还是相当重要的。我们如果想要让统一module(或者说是target)中的其他代码访问的话,保持默认的internal就可以了。如果我们在为其他开发者开发库的话,可能会希望用一些public甚至open,因为在target外只能调用到public和open的代码。public和open的区别在于:只有被open标记的内容才能在别的框架中被集成或者重写。因此,如果你只希望框架的用户使用某个类型和方法,而不希望他们集成或者重写的话,应该将其限定为public而非open。
二、private和fileprivate的区别
1.private和fileprivate修饰属性
![](https://img.haomeiwen.com/i6006739/3356dc1272964c39.png)
在swift4.0中,fileprivate修饰的属性,能在当前文件内访问到,不管是否在本类的作用域;
private只能在本类的作用域且在当前文件内访问
![](https://img.haomeiwen.com/i6006739/c0f045616b6f9fff.png)
在extension中需要用到类的属性时,只要保证是在同一个文件内,无论是用private或fileprivate修饰,都是可以被正常访问的。
2.private和fileprivate修饰方法
![](https://img.haomeiwen.com/i6006739/12ab71cc2fa3f24e.png)
用private修饰的方法不能被调用到
3.子类是否能使用private和fileprivate修饰的代码
(1)在当前文件夹内新增一个person的子类
依然可以访问到父类中的 fileprivate 修饰的方法或属性
但是不能访问到弗雷中的 private修饰的方法或属性
(2)在不同文件夹内新增一个person的子类
可以访问extension中的方法,没加修饰默认为internal,但是不能被重写
但是private和fileprivate修饰的属性或方法都无法访问到
在swift4中,如果子类跟父类不再同一个文件下,是不能够使用fileprivate修饰的方法或属性的,且private修饰的方法和属性无论是否和父类在同一个文件内,都无法使用。
private表示代码只能在当前作用域或统一文件中统一类型的作用域中被使用,fileprivate表示代码可以在当前文件中被访问,而不做类型限定。
网友评论