swift中private,public,internal,fileprivate,open的修饰范围

一.概述

在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|只可以在本类而且在同一个作用域中被访问

你可能感兴趣的:(swift中private,public,internal,fileprivate,open的修饰范围)