Swift 訪問控制

訪問限制可以限定其他源文件或模塊中代碼對你的代碼的訪問級別越除。
你可以明確的給單個類型(類,結構體外盯,枚舉)設置訪問級別摘盆,也可以給這些類型的屬性、函數饱苟、初始化方法孩擂、基本類型、下標索引等設置訪問級別
協(xié)議也可以被限定在一定范圍內使用掷空,包裹協(xié)議中的全部常量肋殴、變量和函數。
訪問控制基于模塊和源文件坦弟。
模塊指的是以獨立單元構建和發(fā)布的 Framework 或 Applicaiton护锤。Swift中的一個模塊可以使用Import關鍵字引入另外一個模塊
源文件是單個源碼文件,它通常屬于一個模塊酿傍,源文件可以包含多個類和函數的定義
Swift提供四種不用訪問級別:public烙懦、internal、filePrivate赤炒、private.

訪問級別 定義
public 可以訪問自己模塊中源文件里的任何實體氯析,別人也可以通過引入該模塊來訪問源文件離得所有實體
interna 可以訪問自己模塊中源文件里的任何實體亏较,但是別人不能訪問該模塊中源文件里的實體
fileprivate 文件內私有 ,只能在當前文件中使用
private 只能在類中訪問掩缓,離開這個內或者結構體的作用域外面就無法訪問

public為最高訪問級別雪情,private為最低訪問級別

通過修飾符public、internal你辣、fileprivate巡通、private來聲明實體的訪問級別:

public class SomePublicClass {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass()

public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}

除非有特殊的說明,否則實體都使用默認的訪問級別 internal舍哄。

函數類型訪問限制

函數的訪問級別需要根據該函數的參數類型和返回類型的訪問級別得出宴凉。

func someFunction() -> (SomeInternalClass,SomePrivateClass) {
  //函數實現
}

該函數神明為為public或internal,或者使用默認的internal都是錯誤的表悬,因為如果這樣你就無法訪問private級別的返回值弥锄。

枚舉類型訪問權限

枚舉中成員的訪問級別繼承自該枚舉,你不能為枚舉中成員單獨申明不同的訪問級別蟆沫。

比如下面的例子籽暇,枚舉 Student 被明確的申明為 public 級別,那么它的成員 Name饭庞,Mark 的訪問級別同樣也是 public:

public enum Student {
    case Name(String)
    case Mark(Int,Int,Int)
}
 
var studDetails = Student.Name("Swift")
var studMarks = Student.Mark(98,97,95)
 
switch studMarks {
case .Name(let studName):
    print("學生名: \(studName).")
case .Mark(let Mark1, let Mark2, let Mark3):
    print("學生成績: \(Mark1),\(Mark2),\(Mark3)")
}

以上程序執(zhí)行輸出結果為:

學生成績: 98,97,95
子類訪問權限

子類的訪問級別不得高于父類的訪問級別图仓。比如說,父類的訪問級別是internal但绕,子類的訪問級別就不能申明為public救崔。

public class SuperClass {
    fileprivate func show() {
        print("超類")
    }
}
 
// 訪問級別不能低于超類 internal > public
internal class SubClass: SuperClass  {
    override internal func show() {
        print("子類")
    }
}
 
let sup = SuperClass()
sup.show()
 
let sub = SubClass()
sub.show()

以上程序執(zhí)行輸出結果為:

超類
子類
常量、變量捏顺、屬性六孵、下標

常量、變量幅骄、屬性不能擁有比它們的類型更高的訪問級別劫窒。
比方說神年,你定義一個public級別的屬性窍奋,但是它們的類型是private級別的,這是編譯器不允許的碱蒙。
同樣下標也不能擁有比索引類型或返回類型更高的訪問級別挪凑。
如果常量孕索、變量、屬性躏碳、下標索引的定義類型是private級別的搞旭,那么它們必須明確申明訪問級別為private:

private var privateInstance = SomePrivateClass()
Getter 和 Setter訪問權限

常量、變量、屬性肄渗、下標索引的Getter和Setter的訪問級別繼承自它們所屬成員的訪問變量镇眷。
Setter的訪問級別可以抵御對應的Getter的訪問級別。這樣可以控制變量翎嫡、屬性或下標索引的讀寫權限欠动。

class Samplepgm {
    fileprivate var counter: Int = 0{
        willSet(newTotal){
            print("計數器: \(newTotal)")
        }
        didSet{
            if counter > oldValue {
                print("新增加數量 \(counter - oldValue)")
            }
        }
    }
}
 
let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800

counter的訪問級為filePrivate,在文件內可以訪問。
以上程序輸出的結果為:

計數器: 100
新增加數量 100
計數器: 800
新增加數量 700
構造默認設置器

初始化:我們可以給自定義的初始化方法申明訪問級別惑申,但是要不高于所屬類的訪問級別翁垂。但必要構造器除外,它的訪問級別必須和所屬類的訪問級別相同硝桩。
如同函數或方法參數,初始化方法參數的訪問級別也不能低于初始化方法的級別枚荣。

默認初始化方法:Swift為結構體碗脊、類提供了一個默認的無參初始化方法,用于給它們的所有屬性提供賦值操作橄妆,但不會給出具體值衙伶。默認初始化方法的訪問級別與所屬類型的訪問級別相同。

在每個子類的 init() 方法前使用 required 關鍵字聲明訪問權限害碾。

class classA {
    required init() {
        var a = 10
        print(a)
    }
}
 
class classB: classA {
    required init() {
        var b = 30
        print(b)
    }
}
 
let res = classA()
let show = classB()

輸出結果為:

10
30
10
協(xié)議類型訪問限制

如果你想為協(xié)議聲明訪問級別矢劲,那么需要注意的是你要確保該協(xié)議只在你你聲明的訪問級別的作用域中使用。
如果你定義了一個public訪問級別的協(xié)議慌随,那么實現該協(xié)議提供的必要函數也會是public的訪問級別芬沉。這一點不同于其他類型,其他級別可以比public低阁猜。

public protocol TcpProtocol {
    init(no1: Int)
}
 
public class MainClass {
    var no1: Int // local storage
    init(no1: Int) {
        self.no1 = no1 // initialization
    }
}
 
class SubClass: MainClass, TcpProtocol {
    var no2: Int
    init(no1: Int, no2 : Int) {
        self.no2 = no2
        super.init(no1:no1)
    }
    
    // Requires only one parameter for convenient method
    required override convenience init(no1: Int)  {
        self.init(no1:no1, no2:0)
    }
}
 
let res = MainClass(no1: 20)
let show = SubClass(no1: 30, no2: 50)
 
print("res is: \(res.no1)")
print("res is: \(show.no1)")
print("res is: \(show.no2)")

輸出結果為:

res is: 20
res is: 30
res is: 50
擴展訪問權限

你可以在條件允許的情況下對類丸逸、結構體、枚舉進行擴展剃袍,擴展成員應該具有和原始類成員一致的訪問級別黄刚。比如你擴展了一個公共類型,那么你新加的成員應該具有和原始成員一樣的默認internal訪問級別民效。
或者你可以明確聲明擴展的訪問級別(比如使用private extension)給擴展所有成員變量設置默認訪問級別憔维。這個新的默認訪問級別仍然可以被單獨成員聲明的訪問級別所覆蓋。

泛型訪問權限

泛型類型或泛型函數的訪問級別去泛型類型畏邢、函數本身业扒、反省類型參數三者中的最低訪問級別。

類型別名

任何你定義的類型別名都會被當做不同的類型舒萎,以便于進行訪問控制凶赁。一個類型別名的訪問級別不可高于原類型的訪問級別。
比如說一個private級別的類型可以設定為public、internal虱肄、private的類型致板,但是一個public級別的類型別名只能是一個public級別的別名的類型,不能設定比public 級別低或高的類型咏窿。

注意:這條規(guī)則也適用于滿足協(xié)議一致性而給相關類型命名別名情況斟或。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市集嵌,隨后出現的幾起案子萝挤,更是在濱河造成了極大的恐慌,老刑警劉巖根欧,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怜珍,死亡現場離奇詭異,居然都是意外死亡凤粗,警方通過查閱死者的電腦和手機酥泛,發(fā)現死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嫌拣,“玉大人柔袁,你說我怎么就攤上這事∫熘穑” “怎么了捶索?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長灰瞻。 經常有香客問我腥例,道長,這世上最難降的妖魔是什么酝润? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任院崇,我火速辦了婚禮,結果婚禮上袍祖,老公的妹妹穿的比我還像新娘底瓣。我一直安慰自己,他們只是感情好蕉陋,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布捐凭。 她就那樣靜靜地躺著,像睡著了一般凳鬓。 火紅的嫁衣襯著肌膚如雪茁肠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天缩举,我揣著相機與錄音垦梆,去河邊找鬼匹颤。 笑死,一個胖子當著我的面吹牛托猩,可吹牛的內容都是我干的印蓖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼京腥,長吁一口氣:“原來是場噩夢啊……” “哼赦肃!你這毒婦竟也來了?” 一聲冷哼從身側響起公浪,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤他宛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后欠气,有當地人在樹林里發(fā)現了一具尸體厅各,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年预柒,在試婚紗的時候發(fā)現自己被綠了队塘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡卫旱,死狀恐怖,靈堂內的尸體忽然破棺而出围段,到底是詐尸還是另有隱情顾翼,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布奈泪,位于F島的核電站适贸,受9級特大地震影響,放射性物質發(fā)生泄漏涝桅。R本人自食惡果不足惜拜姿,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冯遂。 院中可真熱鬧蕊肥,春花似錦、人聲如沸蛤肌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裸准。三九已至展东,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炒俱,已是汗流浹背盐肃。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工爪膊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砸王。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓推盛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親处硬。 傳聞我的和親對象是個殘疾皇子小槐,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容

  • 中文文檔 一、模塊和源文件 Swift 中的訪問控制模型基于模塊和源文件這兩個概念荷辕。 模塊指的是獨立的代碼單元凿跳,框...
    伯wen閱讀 308評論 0 0
  • 訪問控制可以限定其他源文件或模塊中代碼對你代碼的訪問級別。你可以明確地給單個類型(類疮方、結構體控嗜、枚舉)設置訪問級別,...
    零度_不結冰閱讀 173評論 0 0
  • 不想一輩子打工壁顶,創(chuàng)業(yè)又感覺沒有方向,這時候應該怎么辦 現在房貸車貸的壓力大溜歪,生活節(jié)奏快若专。加上大眾創(chuàng)業(yè)的鼓吹,當下的...
    xdaonagjiy閱讀 1,230評論 0 1
  • 1蝴猪,人類發(fā)展到今天除非你是不世出的天才调衰,否則不管你認為自己想出了多么驚世駭俗的點子,都先別激動自阱,去查查看嚎莉,一定已經...
    馬唐閱讀 458評論 0 0
  • 有人說趋箩,高考就是一場硝煙彌漫的戰(zhàn)場,高三是一年你不必考慮形象的時候加派,然而阁簸,我不這么認為。 我們都曾經歷過那一年...
    若言孤夢閱讀 163評論 0 0