一.概述
在Swift3中除去原有的3个访问控制关键字private,public,internal,又重新添加了2个关键字fileprivate和open;
它们是对private和public的进一步细分;
二.private和fileprivate的修饰范围
原来的private对于同一个文件的各个方法来说都可以访问到,这往往不是开发者想要的结果;
于是原来的private变成了fileprivate,而private变为了真正的私有访问控制;
从swift3开始 private的访问权限更小了,而fileprivate代替的原来private的访问权限;
这意味着即使在同一个文件中用private修饰的方法也不可以被代码域之外所访问了;
比如下面这段代码,如果把fileprivate改为private,代码就会报错;
//下面代码虽在在同一个类中,但是不在同一个作用域所以要想调用就不能用private修饰
class ViewController: UIViewController {
fileprivate func test() -> (){
print("wertyuiop")
}
func show_test2() -> (){
test2()
}
}
extension ViewController{
func showTest(){
test()
}
fileprivate func test2(){
print("asdf")
}
}
三.public和open
而对于open来说是补充public语义上的缺陷.原来的public有2层含义:
1.被public修饰后,可以在其他作用域被访问
2.被public修饰后,可以在其他作用域被继承或重载override
而后一种含义从某种意义上说是一件危险的行为,你往往不希望某个类或属性被继承或修改,这就是传统意义上的final;
但是被final标记后在任何地方都不能被override,对于lib设计者来说希望的结果是在module(模块)内可以被override,而在import到外部后不能被override;
这就是open产生的原因,现在的public表示在其他module中不可以被override和继承,而open表示原来public的含义:表示在其他module被访问、被重载、被继承;
四.总结
现在的访问权限由高到低依次为:open,public,interal,fileprivate,private
修饰符号|修饰范围
----|-----|----
open|可以被其他module被访问、被重载、被继承
public|类似于final,可以被其他module被访问,不可以被重载和继承
interal|只能访问自己module(模块)的任何internal实体,不能访问其他模块中的internal实体。internal可以省略,换句话说,默认访问限定是internal
fileprivate|可以在本类中进行访问
private|只可以在本类而且在同一个作用域中被访问
网友评论