美文网首页
swift中private,public,internal,fi

swift中private,public,internal,fi

作者: LewisZhu | 来源:发表于2017-06-26 16:21 被阅读0次

    一.概述

    在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,fi

          本文链接:https://www.haomeiwen.com/subject/ufrjcxtx.html