swift之訪問控制

2021-08-07 06:46:05 字數 3867 閱讀 9000

1、訪問控制種類

swift3.0以後,訪問控制主要分為五類:open、public、internal、fileprivate、private,其中open級別最高,private最低。

訪問控制

定義open

可以訪問自己模組中原始檔裡面的任何實體,其他模組也可以通過引入該模組中原始檔訪問所有的實體,並且其他模組可以繼承本模組的實體和重新本模組中實體的方法

public

可以訪問自己模組中原始檔裡面的任何實體,其他模組也可以通過引入該模組中原始檔訪問所有的實體,但其他模組不可以繼承本模組的實體和重新本模組中實體的方法

internal

可以被自己模組中**訪問其他原始檔裡的任何實體,但是其他模組不能訪問該模組中原始檔裡面的實體

fileprivate

檔案內私有,只能在當前原始檔使用

private

只能在類中訪問,離開了這個類或者結構體的作用域以後就無法訪問

注:原始檔:乙個模組裡面的乙個swift**檔案,乙個原始檔裡面可以包含多個類、結構等。

2、語法

總法則有兩條:

1)不能給乙個變數設定高於其型別訪問許可權的訪問許可權,比如

2)函式的訪問許可權由函式引數和返回值的許可權決定,取兩者許可權的最小值。

預設許可權

如果沒有給乙個實體指定訪問許可權,其預設許可權為internal

許可權控制的語法

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() {}

乙個實體的許可權控制也影響著該實體成員的許可權:如果乙個實體許可權控制為private或fileprivate,那麼他的成員預設訪問許可權為private或fileprivate;如果乙個實體許可權控制為internal或public,那麼他的成員預設訪問許可權為internal。如果想讓乙個訪問許可權為public的實體的成員許可權也為public,必須自己指定該成員的許可權為public。

public

class somepublicclass //

explicitly file-private class member

private func someprivatemethod() {} //

explicitly private class member}

class someinternalclass //

explicitly file-private class member

private func someprivatemethod() {} //

explicitly private class member}

fileprivate

class somefileprivateclass //

implicitly file-private class member

private func someprivatemethod() {} //

explicitly private class member}

private

class someprivateclass //

implicitly private class member

}

元組的訪問許可權元組的訪問許可權取決於他包含所有型別的許可權最小值。比如乙個元組包含兩個型別,乙個型別的許可權為internal,乙個型別的許可權為private,那麼該元組的訪問許可權為private。

函式的訪問許可權

函式的訪問許可權規則已經在上面說了,這裡不再贅述。直接上例子:

列舉型別的訪問許可權

列舉成員的訪問級別繼承自該列舉,不能單獨為列舉中的成員單獨宣告不同的訪問許可權

子類的訪問許可權

子類的訪問許可權不能高於父類的訪問許可權。比如,父類的訪問許可權為internal,子類的訪問許可權就不能為public。另外,你可以在子類裡面重寫父類裡面的(方法,屬性,建構函式,下表訪問器),但是要遵守三個原則(以方法為例說明):1、能在子類中訪問到父類裡面的方法;2、可以給重寫方法設定新的訪問許可權;3、新賦予的許可權需要大於等於父類該方法的訪問許可權級別。例子如下:

常量、變數、屬性、下標的訪問許可權

他們的訪問許可權不能高於對應型別的訪問許可權。

getter和setter訪問許可權

常量、變數、屬性、下標索引的getter和setter的訪問許可權繼承自他們所屬成員的訪問級別。你可以把setter的訪問許可權設定地低於對應的getter的許可權,這樣就能夠控制變數、屬性、下標索引的讀寫許可權。設定setter訪問許可權的方法為把fileprivate(set),private(set),internal(set)放在變數、屬性、下標索引的前面

struct

trackedstring }}

如果既想對getter進行修改,也想對setter進行修改,可以如下設定:

public

struct

trackedstring

}public

init() {}

}

構造器和預設構造器的訪問許可權對自定義的構造器設定訪問許可權的時候,不能高於他所屬類的訪問許可權。但是對於必要構造器,他的訪問許可權必須跟所屬類的訪問許可權相同。

swift為結構體、類提供了乙個預設的無參初始化方法,用於給他們的所有屬性賦值,但不會給出具體指。預設初始化方法的訪問許可權與所屬型別的訪問許可權相同,注意當類、結構體的許可權為public時,預設構造器的訪問許可權為internal

協議的訪問許可權

如果要為乙個協議設定訪問許可權,那麼要確保該協議只在設定的訪問許可權作用域中使用。乙個類可以實現乙個比自己訪問許可權低的協議,比如定義乙個public的類,他又實現了乙個internal的協議,那麼這個類的訪問許可權為internal(取兩者的最小值)。

擴充套件的訪問許可權

擴充套件成員和原始類成員有一致的訪問許可權,比如你擴充套件了乙個帶有public許可權的類,那麼新加的成員應該有和原始成員一樣的預設為internal的訪問許可權。另外,可以給擴充套件設定明確的訪問許可權(例如:private extension),擴充套件中成員也可以設定自己的訪問許可權。

Swift 訪問控制

原始檔就是 swift 中的源 檔案,它通常屬於乙個模組,即乙個應用程式或者框架。儘管我們一般會將不同的型別分別定義在不同的原始檔中,但是同乙個原始檔也可以包含多個型別 函式之類的定義。internal 級別讓實體被同一模組原始檔中的任何實體訪問,但是不能被模組外的實體訪問。file private...

Swift 中的訪問控制

訪問許可權範圍依次為 private fileprivate internal public open private 訪問級別所修飾的屬性或者方法只能在當前類裡訪問。fileprivate 訪問級別所修飾的屬性或者方法在當前的 swift 原始檔裡可以訪問。public 修飾的屬性或方法可以被任何...

SWIFT邏輯控制之控制轉移

swift 提供了5個關鍵字 break continue。fallthrough。return。throw 下面通過乙個例子來幫助我們理解break的使用 需求 求x 4 y 2 15 x y在300以內的乙個正整數解 我們可以列舉1 300的數 方法一 var getanswer false g...