Swift-訪問控制(Access Control)

Swift中包含三種權(quán)限控制

  • public (公開, 供外部調(diào)用)
  • internal (默認(rèn), 限module內(nèi)使用)
  • private (私有, 限source file內(nèi)使用)

名詞解釋

  1. module是個(gè)代碼發(fā)布單元(如Framework或者應(yīng)用程序), 通過使用import關(guān)鍵字導(dǎo)入使用
  2. A source files是module中的一個(gè)swift文件 (實(shí)際情況就是一個(gè)app或者framework中的一個(gè)swift文件)

internal

默認(rèn)控制權(quán)限, 如果單target用戶,不需要刻意強(qiáng)調(diào)控制權(quán)限,默認(rèn)權(quán)限就足夠了

public

使用場景framework, 用于公開api調(diào)用, 其他framework內(nèi)部使用方法采用 internal 方便framework內(nèi)部調(diào)用,但是對framework外部不可使用

private

原文為(use in sourcefile), 即定義的private僅能在當(dāng)前文件使用,子類及繼承均不能使用

使用等級

private < internal < public

測試訪問控制

@testable 使得internal的也可以被訪問

使用規(guī)則

不能包含比自己使用等級更大的實(shí)體

Demo

新建一個(gè)workspace, 包括一個(gè)framework(CECModuleFrame)和一個(gè)demo(ModuleDemo)
在framework中新建類 ModuleApi.swift
<pre>
`
import Foundation

class ModuleApi {
public func helloWorld() { //警告:Declaring a public instance method for an internal class,表明不能在一個(gè)internal權(quán)限的類中新建一個(gè)public的方法
print("Hello world")
}
}
</pre> 如上代碼所示, 如果不寫控制權(quán)限關(guān)鍵詞,則默認(rèn)為*internal*, 為了讓文件被外部訪問,需要添加public關(guān)鍵詞,如下所示 <pre>
public class ModuleApi {
public init() {

}

// 想被外部訪問,則必須添加public關(guān)鍵詞
public let somePublicProperty = "Module"

// 想被外部訪問,則必須添加public關(guān)鍵詞
public func helloWorld() { 
    print("Hello world")
}

}

// 外部使用方法:
let api = ModuleApi()
api.helloWorld() // 輸出: Hello world
print(api.somePublicProperty) // 輸出Module
`
</pre>

TupleType訪問權(quán)限

多個(gè)對象,返回最小權(quán)限類型
<pre>(public, internal) 得到的是internal權(quán)限 (public, private) 得到的是private權(quán)限
</pre>

方法訪問控制

<pre>`
public class ModuleApi {
public init() {

}

// 提示出錯(cuò):Method must be declared private because its result uses a private type
func someFunction()->(PrivateClass, InternalClass) {
    
}

}

private class PrivateClass {
}

internal class InternalClass {
}
`</pre>

Enum類型

選項(xiàng)的權(quán)限跟著enum的定義
<pre>public enum CompassPoint { case North // 訪問權(quán)限為public }</pre>

類\常量\變量\屬性等都遵循著使用規(guī)則

Getter & Setter

在var 或者subscript前使用private(set) or internal(set)獲得更低的使用權(quán)限
<pre>`
struct TrackedString {
private(set) var numberOfEdits = 0
var value: String = "" {
didSet {
numberOfEdits++
}
}
}

// 可以聯(lián)合使用public和private(set)
public struct TrackedString {
public private(set) var numberOfEdits = 0
public var value: String = "" {
didSet {
numberOfEdits++
}
}
public init() {}
}
`</pre>

Initializers

  1. A required initializer must have the same access level as the class it belongs to.”
  2. As with function and method parameters, the types of an initializer’s parameters cannot be more private than the initializer’s own access level.

Default Initializers

As described in Default Initializers, Swift automatically provides a default initializer without any arguments for any structure or base class that provides default values for all of its properties and does not provide at least one initializer itself.

A default initializer has the same access level as the type it initializes, unless that type is defined as public. For a type that is defined as public, the default initializer is considered internal. If you want a public type to be initializable with a no-argument initializer when used in another module, you must explicitly provide a public no-argument initializer yourself as part of the type’s definition.

類或者Struct如果使用了public,默認(rèn)初始器是internal的,所以需要提供一個(gè)對應(yīng)的public的初始器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芋类,隨后出現(xiàn)的幾起案子拉讯,更是在濱河造成了極大的恐慌雄可,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件髓梅,死亡現(xiàn)場離奇詭異叶组,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)台妆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門翎猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人接剩,你說我怎么就攤上這事∪龋” “怎么了懊缺?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長培他。 經(jīng)常有香客問我鹃两,道長,這世上最難降的妖魔是什么舀凛? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任俊扳,我火速辦了婚禮,結(jié)果婚禮上猛遍,老公的妹妹穿的比我還像新娘馋记。我一直安慰自己,他們只是感情好懊烤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布梯醒。 她就那樣靜靜地躺著,像睡著了一般腌紧。 火紅的嫁衣襯著肌膚如雪茸习。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天壁肋,我揣著相機(jī)與錄音号胚,去河邊找鬼。 笑死浸遗,一個(gè)胖子當(dāng)著我的面吹牛猫胁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乙帮,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杜漠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了察净?” 一聲冷哼從身側(cè)響起驾茴,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氢卡,沒想到半個(gè)月后锈至,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡译秦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年峡捡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了击碗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡们拙,死狀恐怖稍途,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砚婆,我是刑警寧澤械拍,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站装盯,受9級特大地震影響坷虑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜埂奈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一迄损、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧账磺,春花似錦芹敌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至借宵,卻和暖如春幌衣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壤玫。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工豁护, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欲间。 一個(gè)月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓楚里,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猎贴。 傳聞我的和親對象是個(gè)殘疾皇子班缎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

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