一.概述
在Swift3中除去原有的3個訪問控制關(guān)鍵字private,public,internal,又重新添加了2個關(guān)鍵字fileprivate和open株婴;
它們是對private和public的進一步細分内舟;
二.private和fileprivate的修飾范圍
原來的private對于同一個文件的各個方法來說都可以訪問到,這往往不是開發(fā)者想要的結(jié)果;
于是原來的private變成了fileprivate,而private變?yōu)榱苏嬲乃接性L問控制宴卖;
從swift3開始 private的訪問權(quán)限更小了,而fileprivate代替的原來private的訪問權(quán)限;
這意味著即使在同一個文件中用private修飾的方法也不可以被代碼域之外所訪問了捌归;
比如下面這段代碼亿絮,如果把fileprivate改為private告喊,代碼就會報錯;
//下面代碼雖在在同一個類中,但是不在同一個作用域所以要想調(diào)用就不能用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
而后一種含義從某種意義上說是一件危險的行為,你往往不希望某個類或?qū)傩员焕^承或修改,這就是傳統(tǒng)意義上的final;
但是被final標(biāo)記后在任何地方都不能被override,對于lib設(shè)計者來說希望的結(jié)果是在module(模塊)內(nèi)可以被override,而在import到外部后不能被override蒂萎;
這就是open產(chǎn)生的原因,現(xiàn)在的public表示在其他module中不可以被override和繼承,而open表示原來public的含義:表示在其他module被訪問秆吵、被重載、被繼承五慈;
四.總結(jié)
現(xiàn)在的訪問權(quán)限由高到低依次為:open,public,interal,fileprivate,private
修飾符號 | 修飾范圍 |
---|---|
open | 可以被其他module被訪問纳寂、被重載、被繼承 |
public | 類似于final泻拦,可以被其他module被訪問毙芜,不可以被重載和繼承 |
interal | 只能訪問自己module(模塊)的任何internal實體,不能訪問其他模塊中的internal實體争拐。internal可以省略腋粥,換句話說,默認訪問限定是internal |
fileprivate | 可以在本類中進行訪問 |
private | 只可以在本類而且在同一個作用域中被訪問 |
轉(zhuǎn)自:http://www.reibang.com/p/abedf5db0d83