原始檔就是 swift 中的源**檔案,它通常屬於乙個模組,即乙個應用程式或者框架。儘管我們一般會將不同的型別分別定義在不同的原始檔中,但是同乙個原始檔也可以包含多個型別、函式之類的定義。
internal 級別讓實體被同一模組原始檔中的任何實體訪問,但是不能被模組外的實體訪問。
file-private 限制實體只能在其定義的檔案內部訪問。
private 限制實體只能在其定義的作用域,以及同一檔案內的 extension 訪問。
open 為最高訪問級別(限制最少),private 為最低訪問級別(限制最多)。
open 只能作用於類和類的成員,它和 public 的區別如下:
把乙個類標記為 open,明確的表示你已經充分考慮過外部模組使用此類作為父類的影響,並且設計好了你的類的**了。
public
class
somepublicclass
internal
class
someinternalclass
fileprivate class
somefileprivateclass
private
class
someprivateclass
public
var somepublicvariable =
0internal
let someinternalconstant =
0fileprivate func
somefileprivatefunction()
private
func
someprivatefunction()
class
someinternalclass
// 隱式 internal
var someinternalconstant =
0// 隱式 internal
重點:上面提到,乙個 public 型別的所有成員的訪問級別預設為 internal 級別,而不是 public 級別。
如果你想將某個成員指定為 public 級別,那麼你必須顯式指定。
這樣做的好處是,在你定義公共介面的時候,可以明確地選擇哪些介面是需要公開的,哪些是內部使用的,避免不小心將內部使用的介面公開。
public
class
somepublicclass
// 顯式 fileprivate 類成員
private
func
someprivatemethod()
// 顯式 private 類成員}
class
someinternalclass
// 顯式 fileprivate 類成員
private
func
someprivatemethod()
// 顯式 private 類成員}
fileprivate class
somefileprivateclass
// 隱式 fileprivate 類成員
private
func
someprivatemethod()
// 顯式 private 類成員}
private
class
someprivateclass
// 隱式 private 類成員
}
func
somefunction()
->
(someinternalclass
,someprivateclass
)
我們可以看到,這個函式的返回型別是乙個元組,該元組中包含兩個自定義的類(可查閱 自定義型別)。所以根據元組訪問級別的原則,該元組的訪問級別是 private(元組的訪問級別與元組中訪問級別最低的型別一致)。其中乙個類的訪問級別是 internal
另乙個的訪問級別是 private
private
func
somefunction()
->
(someinternalclass
,someprivateclass
)
將該函式指定為 public 或 internal,或者使用預設的訪問級別 internal 都是錯誤的,因為如果把該函式當做 public 或 internal 級別來使用的話,可能會無法訪問 private 級別的返回值。
public
enum
compasspoint
此外,你可以在符合當前訪問級別的條件下重寫任意類成員(方法、屬性、構造器、下標等)。
可以通過重寫為繼承來的類成員提供更高的訪問級別。通過這種方式,我們就可以將某類中 fileprivate 級別的類成員重新指定為更高的訪問級別,以便其他人使用:
/*
類 a 的訪問級別是 public
它包含乙個方法 somemethod()
訪問級別為 fileprivate
*/public
classa}
/*類 b 繼承自類 a,訪問級別為 internal
但是在類 b 中重寫了類 a 中訪問級別為 fileprivate 的方法 somemethod()
並重新指定為 internal 級別
*/internal
class
b: a
}
public
classa}
internal
class
b: a
}
因為父類 a 和子類 b 定義在同乙個原始檔中,所以在子類 b 可以在重寫的 somemethod() 方法中呼叫 super.somemethod()。
private
var privateinstance =
someprivateclass
()
struct
trackedstring
}}
trackedstring 結構體定義了乙個用於儲存 string 值的屬性 value,並將初始值設為 「」(乙個空字串)。該結構體還定義了另乙個用於儲存 int 值的屬性 numberofedits,它用於記錄屬性 value 被修改的次數。
這個功能通過屬性 value 的 didset 觀察器實現,每當給 value 賦新值時就會呼叫 didset 方法,然後將 numberofedits 的值加一。
結構體 trackedstring 和它的屬性 value 都沒有顯式地指定訪問級別,所以它們都是用預設的訪問級別 internal。
但是該結構體的 numberofedits 屬性使用了 private(set) 修飾符,這意味著 numberofedits 屬性只能在結構體的定義中進行賦值。
numberofedits 屬性的 getter 依然是預設的訪問級別 internal,但是 setter 的訪問級別是 private,這表示該屬性只能在內部修改,而在結構體的外部則表現為乙個唯讀屬性。
var stringtoedit =
trackedstring()
stringtoedit.value =
"this string will be tracked."
stringtoedit.value +
=" this edit will increment numberofedits."
stringtoedit.value +
=" so will this one."
print
("the number of edits is \(stringtoedit.numberofedits)")
// 列印「the number of edits is 3」
public
struct
trackedstring
}public
init()
}
這意味著你可以像組織的**去使用 extension,而且不受私有成員的影響。例如,給定下面這樣乙個簡單的協議:
protocol
someprotocol
struct
somestruct
extension
somestruct
:someprotocol
}
swift之訪問控制
1 訪問控制種類 swift3.0以後,訪問控制主要分為五類 open public internal fileprivate private,其中open級別最高,private最低。訪問控制 定義open 可以訪問自己模組中原始檔裡面的任何實體,其他模組也可以通過引入該模組中原始檔訪問所有的實體...
Swift 中的訪問控制
訪問許可權範圍依次為 private fileprivate internal public open private 訪問級別所修飾的屬性或者方法只能在當前類裡訪問。fileprivate 訪問級別所修飾的屬性或者方法在當前的 swift 原始檔裡可以訪問。public 修飾的屬性或方法可以被任何...
Swift學習筆記系列 (24)訪問控制
tags swift 學習筆記 單個的類 結構體和列舉 屬於1的屬性 方法 構造方法和下標 協議的適用範圍 訪問控制的基礎 一系列 xcode中的乙個構造目標 單獨的源 檔案 本模組的任意原始檔內可以訪問 匯入所在模組的其他模組的原始檔可以訪問 預設的訪問級別 同一模組的任意源 中都可以訪問 同一原...