在Swift 3中除去原有的3个访问控制关键字private,public,internal,又添加了2个关键字fileprivate和open
它们可以看成是对private和public的进一步细分
原来的private对于同一个文件的各个方法来说都可以访问到,这往往不是开发者想要的结果,于是原来的private变成了fileprivate,而private变为了真正的私有访问控制.这意味着即使在同一个文件中用private修饰的方法也不可以被代码域之外所访问了:
class Foo{
private func test(){
print("hello private func!!!")
}
func show(){
test()
}
}
class Sub:Foo{
func show_sub(){
test() //ERROR!!!
}
}
Foo().show()
如果把上述代码中的private换为fileprivate那么一切照旧,错误就会消失.
而对于open来说是补充public语义上的缺陷.以往的public有2层含义:
1.该item可以在其他作用域被访问
2.给item可以在其他作用域被继承或重载override
而后一种含义从某种意义上说是一件危险的行为,你往往不希望某个类或属性被继承或修改,这就是传统意义上的final
但是被final标记后在任何地方都不能被override,对于lib设计者来说希望的结果是在module内可以被override,而在import到外部后不能被override
这就是open产生的原因,现在的public表示在其他module中不可以被override和继承,而open表示原来public的含义.
现在的访问权限由高到低依次为:open,interal,fileprivate,private
参考精彩的博文:Swift 3必看:新的访问控制fileprivate和open