Swift基礎(chǔ)知識(shí)之訪問(wèn)控制

一币绩、訪問(wèn)控制(Access Control)

  • Swift提供了5個(gè)不同的訪問(wèn)級(jí)別(以下是從高到底排列迎变,實(shí)體指被訪問(wèn)級(jí)別修飾的內(nèi)容)
    • open:允許在定義實(shí)體的模塊、其他模塊訪問(wèn)氛谜,允許被其他模塊進(jìn)行繼承君账、重寫(xiě)(open只能用在類、類的成員上) 服鹅;
    • public:允許在定義實(shí)體的模塊凳兵、其他模塊中訪問(wèn),允許被其他模塊進(jìn)行繼承企软、重寫(xiě)庐扫;
    • internal:只允許在定義實(shí)體的模塊中訪問(wèn),不允許其他模塊中訪問(wèn);
    • fileprivate:只允許在定義實(shí)體的源文件中訪問(wèn)(相當(dāng)于當(dāng)前類)形庭;
    • private:只允許在定義實(shí)體的封閉聲明中訪問(wèn)铅辞;

二、訪問(wèn)級(jí)別的使用準(zhǔn)則

  • 一個(gè)實(shí)體不可以被更低訪問(wèn)級(jí)別的實(shí)體定義萨醒,比如:
    • 變量斟珊、常量類型 >= 變量、常量
    • 參數(shù)類型富纸、返回值類型 >= 函數(shù)
    • 父類 >= 子類
    • 父協(xié)議 >= 子協(xié)議
    • 原類型 >= typealias
    • 原始值類型囤踩、關(guān)聯(lián)值類型 >= 枚舉類型
    • 定義類型A時(shí)用到的其他類型 >= A類型
private class Car {
    var name: String?
    func testP() {
    }
}
//Variable must be declared private or fileprivate because its type uses a private type
var c: Car?
// 相當(dāng)于別定義的c的訪問(wèn)權(quán)限不大于Car的訪問(wèn)權(quán)限
  • 總之:一個(gè)類型在定義時(shí)不會(huì)大于定義它的實(shí)體類型

三、元組晓褪、泛型類型

  • 元組類型的訪問(wèn)級(jí)別是所有成員類型最低的那個(gè)
fileprivate class Car {
}

internal class Dog {
    
}
// 這里會(huì)報(bào)錯(cuò)
internal var data1 : (Dog, Car)
// 這里的訪問(wèn)級(jí)別是fileprivate堵漱、
  • 就是會(huì)根據(jù)最低的那個(gè)訪問(wèn)級(jí)別確定總的訪問(wèn)級(jí)別
  • 泛型類型的訪問(wèn)級(jí)別是 類型的訪問(wèn)級(jí)別 以及所有泛型類型參數(shù)的訪問(wèn) 解包中最低的那個(gè)

四、成員涣仿、嵌套類型

  • 類型的訪問(wèn)級(jí)別會(huì)影響成員(屬性勤庐、下標(biāo)、方法好港、初始化器)愉镰、嵌套類型的默認(rèn)訪問(wèn)級(jí)別
  • 一般情況下,類型為private或者fileprivate钧汹,那么成員丈探、嵌套類型默認(rèn)也是private、fileprivate
  • 一般情況下崭孤,類型為internal或public类嗤,那么成員、嵌套類型默認(rèn)為internal
public class Car {
    public var p1 = 0 // public
    var p2 = 0  // internal
}
internal class Dog {
    var name: String?  // internal
    private func f1() {} // private
}

五辨宠、成員的重寫(xiě)

  • 子類重寫(xiě)成員的訪問(wèn)級(jí)別必須 >= 子類的訪問(wèn)級(jí)別遗锣,或者>=父類被重寫(xiě)成員的訪問(wèn)級(jí)別
public class Person {
    fileprivate var p1 = 0
}

class Student : Person {
    override var p1: Int { // internal
        set {}
        get { 10 }
    }
}
  • 父類的成員不能被成員作用域外定義的子類重寫(xiě)
public class Person {
    private var p1 = 0
    
    class Student : Person {
        override var p1: Int { // internal
            set {}
            get { 10 }
        }
    }
}
  • 總之成員重寫(xiě)后的訪問(wèn)權(quán)限是不小于之前的訪問(wèn)權(quán)限
  • 直接在全局作用域下定義的private等價(jià)于fileprivate

六、getter嗤形、setter方法默認(rèn)自動(dòng)接收他們所屬環(huán)境的訪問(wèn)級(jí)別

  • 可以給setter單獨(dú)設(shè)置一個(gè)比getter更低的訪問(wèn)級(jí)別精偿,用來(lái)限制寫(xiě)的權(quán)限
// 這句話是說(shuō)set的權(quán)限是fileprivate、getter的權(quán)限是public
fileprivate(set) public var num = 10 

七赋兵、初始化器

  • 如果一個(gè)public類想在另一個(gè)模塊調(diào)用編譯生成的默認(rèn)初始化器笔咽,必須顯示提供public的無(wú)參初始化器
  • 因?yàn)閜ublic的默認(rèn)初始化器是internal級(jí)別
  • required初始化器 >= 它的默認(rèn)訪問(wèn)級(jí)別
  • 如果結(jié)構(gòu)體有private、fileprivate的存儲(chǔ)實(shí)例屬性霹期,那么它的成員初始化器也是private叶组、fileprivate
  • 否則就是internal

八、枚舉類型的case

  • 補(bǔ)鞥呢給enum的每個(gè)case單獨(dú)設(shè)置訪問(wèn)級(jí)別
  • 每個(gè)case自動(dòng)接收enum的訪問(wèn)級(jí)別
  • public enum定義的case也是public
public enum Shape {
    case circle, triangle, square // public
}

九历造、協(xié)議

  • 協(xié)議中定義的要求自動(dòng)接收協(xié)議的訪問(wèn)級(jí)別甩十,不能單獨(dú)設(shè)置訪問(wèn)級(jí)別
  • public 協(xié)議定義的要求也是public
  • 協(xié)議實(shí)現(xiàn)的訪問(wèn)級(jí)別 >= 類型的訪問(wèn)級(jí)別船庇,或者 >= 協(xié)議的訪問(wèn)級(jí)別
public protocol Run { func ru() }

public class Car : Run {
// 這里會(huì)報(bào)錯(cuò)、因?yàn)槟J(rèn)的訪問(wèn)級(jí)別是internal侣监、而協(xié)議的是public
    func ru() {
        
    }
}

十鸭轮、擴(kuò)展

  • 如果有顯式設(shè)置擴(kuò)展的訪問(wèn)級(jí)別,擴(kuò)展添加的成員自動(dòng)接收擴(kuò)展的訪問(wèn)級(jí)別
  • 如果沒(méi)有顯式設(shè)置擴(kuò)展的訪問(wèn)級(jí)別橄霉,擴(kuò)展添加的成員的默認(rèn)訪問(wèn)級(jí)別窃爷,跟直接在類型中定義的成員一致
  • 可以單獨(dú)給擴(kuò)展添加的成員設(shè)置訪問(wèn)級(jí)別
  • 不能給用于遵守協(xié)議的擴(kuò)展顯式設(shè)置擴(kuò)展訪問(wèn)級(jí)別
  • 在同一文件中的擴(kuò)展,可以寫(xiě)成類似多個(gè)部分的類型聲明
  • 在原本的聲明中聲明一個(gè)私有成員姓蜂,可以在同一文件的擴(kuò)展中訪問(wèn)它
  • 在擴(kuò)展中聲明的私有成員按厘,可以在同一文件的其他擴(kuò)展中、原本聲明中訪問(wèn)它
public class Person {
    private func run() {}
    private func eat() {}
}

extension Person {
    private func run1 {}
    private func eat1() {
        eat()
    }
}

至此钱慢、swift訪問(wèn)控制基本說(shuō)完刻剥,如有不當(dāng)之處、還請(qǐng)各位大佬批評(píng)指正滩字,不勝感激!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末麦箍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子陶珠,更是在濱河造成了極大的恐慌挟裂,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揍诽,死亡現(xiàn)場(chǎng)離奇詭異诀蓉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)暑脆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門渠啤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人添吗,你說(shuō)我怎么就攤上這事沥曹。” “怎么了碟联?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵妓美,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鲤孵,道長(zhǎng)壶栋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任普监,我火速辦了婚禮贵试,結(jié)果婚禮上琉兜,老公的妹妹穿的比我還像新娘。我一直安慰自己锡移,他們只是感情好呕童,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著淆珊,像睡著了一般夺饲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上施符,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天往声,我揣著相機(jī)與錄音,去河邊找鬼戳吝。 笑死浩销,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的听哭。 我是一名探鬼主播慢洋,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼陆盘!你這毒婦竟也來(lái)了普筹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤隘马,失蹤者是張志新(化名)和其女友劉穎太防,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體酸员,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜒车,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幔嗦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酿愧。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖邀泉,靈堂內(nèi)的尸體忽然破棺而出寓娩,到底是詐尸還是另有隱情,我是刑警寧澤呼渣,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布棘伴,位于F島的核電站,受9級(jí)特大地震影響屁置,放射性物質(zhì)發(fā)生泄漏焊夸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一蓝角、第九天 我趴在偏房一處隱蔽的房頂上張望阱穗。 院中可真熱鬧饭冬,春花似錦、人聲如沸揪阶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鲁僚。三九已至炊苫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冰沙,已是汗流浹背侨艾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拓挥,地道東北人唠梨。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像侥啤,于是被迫代替她去往敵國(guó)和親当叭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 可以給單個(gè)類型如類盖灸、結(jié)構(gòu)體科展、枚舉設(shè)置訪問(wèn)級(jí)別,也可以給這些類型的屬性糠雨、方法、下標(biāo)徘跪、構(gòu)造器等設(shè)置訪問(wèn)級(jí)別甘邀。也包括協(xié)議...
    xmb閱讀 467評(píng)論 0 0
  • 1、隱式解析可選類型 有時(shí)候在程序架構(gòu)中垮庐,第一次被賦值之后松邪,可以確定一個(gè)可選類型總會(huì)有值,這時(shí)候每次使用時(shí)都判斷和...
    Mr_xuy閱讀 477評(píng)論 1 4
  • 本章將會(huì)介紹 模塊和源文件訪問(wèn)級(jí)別訪問(wèn)控制語(yǔ)法自定義類型子類常量、變量寒亥、屬性邮府、下標(biāo)構(gòu)造器協(xié)議擴(kuò)展泛型類型別名位運(yùn)算...
    寒橋閱讀 881評(píng)論 0 2
  • 在訪問(wèn)控制這塊,Swift提供了五個(gè)不同的訪問(wèn)級(jí)別(以下是從高到低排列溉奕,實(shí)體指被訪問(wèn)級(jí)別修飾的內(nèi)容) open :...
    西風(fēng)那個(gè)吹呀吹閱讀 1,151評(píng)論 0 2
  • 中文文檔 一褂傀、模塊和源文件 Swift 中的訪問(wèn)控制模型基于模塊和源文件這兩個(gè)概念。 模塊指的是獨(dú)立的代碼單元加勤,框...
    伯wen閱讀 306評(píng)論 0 0