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

转自:https://www.jianshu.com/p/abedf5db0d83

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容