Swift 二十四 訪問許可權

2021-07-07 05:27:36 字數 4907 閱讀 4313

1、swift入門學習筆記(第一版),對swift的基礎知識點進行梳理總結。知識點一直在變,只是作為參考,以蘋果官方文件為準~

2、在學習完基本的知識點以後會結合官方文件及相關資料,在此版本的基礎上進行新增更改。

這部分的內容有點繞,感覺一下子記住也不現實,只是有個大概的思路,基本的記住,用到去查,以後用熟了可能會好些

限定其他原始檔或模組中**對你的**的訪問級別

原始檔:swift中的swift file,編寫源**的檔案,通常屬於乙個模組。

2.1、三個級別:由高到低

public:可以訪問當前模組中原始檔裡的任何實體。別人引入當前模組也能訪問。當想讓framework中的某個介面被任何人使用時,設為public級別

internal:可以訪問當前模組中原始檔裡的任何實體。但別人引入當前模組不能訪問。某個介面或framework作為內部結構使用時,設為internal

private:只能在當前原始檔中使用的實體,稱為私有實體。常用來隱藏某些功能的而實現細節

因此swift中的private區別於其他語言,只要在同一原始檔下,乙個類可以訪問該類定義的所有private實體

2.2、使用原則

使用原則:訪問級別統一性

乙個public訪問級別的變數,不能將其定義為internalprivate—->這句話很拗口,是不能重新定義的意思麼?

函式的訪問級別不能高於它的引數、返回值型別

2.3、預設訪問級別

預設為internal

類的訪問級別會影響類成員(屬性,函式,構造方法等)的預設級別。

注意即使這個類是public級別,但是它的成員預設為internal級別,而不是public

public

class somepublicclass // 顯式的 private 類成員

}class someinternalclass // 顯式的 private 類成員

}private

class someprivateclass // 隱式的 private 類成員

}

3.1、元組型別

可構建乙個包含兩種不同型別元素的元組,訪問級別也可不同。

元組的訪問級別與元組中訪問級別最低的型別一致

3.2、函式型別

函式的訪問級別需要根據函式的引數型別和返回值型別的訪問級別得出,也是跟最低級別一致

例如下列函式:

private func somefunction() -> (someinternalclass, someprivateclass)
返回值為元組,級別是private,那麼函式也是private,必須要用private申明,而不能預設為internal級別,或者申明為public

3.3、列舉型別

列舉的成員訪問級別繼承自該列舉,不能為列舉中那個的成員單獨申明不同的訪問級別

3.4、原始值和關聯值

列舉中定義的原始值和關聯值必須有乙個訪問級別,且不能低於列舉的訪問級別

3.5、巢狀型別

巢狀型別定義為:private,該巢狀型別自動獲得private訪問級別

巢狀型別定義為:publicinternal,該巢狀型別自動擁有internal訪問級別,如果想讓其有public訪問級別,需要顯式宣告

3.6、子類

子類的訪問級別不能高於父類的訪問級別

同時還滿足各訪問級別作用於的前提下,可以重寫任意類成員(方法,屬性,初始化方法,下標索引等)。即使是private也能重寫,子類還能訪問父類成員

滿足前兩者條件——>可重寫,可訪問父類方法

public

class a

}internal

class b: a

}

3.7、常量、變數、屬性、下標

常量、變數、屬性不能擁有比他們的型別更高的訪問級別

3.8、getter和setter

gettersetter的訪問級別繼承自他們所屬成員的訪問級別

setter的級別可以低於getter,這樣就可以控制變數、屬性或下標索引的讀寫許可權。可以在varsubscript定義作用於之前,通過private(set)internal(set)先為他們的寫許可權申明乙個較低的級別。

————>此規定只適用於儲存屬性或計算屬性,即使不明確的申明儲存屬性的settergetterswift也會隱式地建立,對其進行讀取操作,同時也通過private(set)internal(set)設定訪問級別

例項

struct trackedstring 

}}

儲存string的屬性value,初始值為空,同時定義numberofedits來記錄屬性value被修改的次數。

結構體和value都沒有顯式地申明訪問級別,預設擁有的訪問級別internal。但是numberofedits使用private(set)進行宣告,表示該屬性只能在定義該結構體的原始檔中賦值。但是它的getter是internal級別的。說明numberofedits只在當前原始檔可讀寫,而在原始檔所屬模組中只是可讀屬性

var stringtoedit = trackedstring()

stringtoedit.value = "a"

stringtoedit.value += "+b"

stringtoedit.value += "+c"

stringtoedit.value += "+d"

print("the number of edits is \(stringtoedit.numberofedits)")

output:

of edits is

44.1、初始化

初始化方法可申明級別,但不能高於所屬類的訪問級別

必要構造器級別必須和所屬類的訪問級別一樣

4.2、預設初始化方法

預設初始化方法的訪問級別與所屬型別的訪問級別相同,但是最高端別為internal

但是注意:如果乙個類是public,那麼預設初始化的訪問級別為internal如果想讓無參的預設初始化在其他模組中被使用,那麼必須提供public級別的無引數初始化方法

4.3、結構體的預設成員初始化方法

只要結構體中任一儲存屬性的級別為private,那麼預設成員初始化方法級別為private

儘管如此,結構體的初始化方法的訪問級別依然是internal

5.1、協議

為協議申明級別,需要注意確保協議旨在申明的訪問級別作用域中使用

協議中每個必須要實現的函式都跟協議相同的訪問級別

區別於其他型別,public級別的協議,實現函式也是public的訪問級別。其他的型別public訪問級別,他們的成員都是internal的!!!!

5.2、協議繼承

繼承的協議最高只能和被繼承協議的訪問級別相同

5.3、協議一致性

類的訪問級別取決於它本身和所採用協議中最低的訪問級別

高階別類可以採用比自己級別低得協議,但是這個類自身的訪問級別也會降級

6.1、擴充套件

擴充套件成員具有和原始類成員一致訪問級別

或者可以明確申明擴充套件的訪問級別(比如用private extension)給擴充套件內所有成員申請乙個新的預設訪問級別。新的預設訪問級別仍可以被單獨成員所申明的訪問級別所覆蓋

6.2、協議的擴充套件

擴充套件協議遵循該協議的訪問級別

取決於泛型型別、函式本身、泛型型別引數三者中的最低訪問級別

任何定義的型別別名都會被當做不同的型別,以便於進行訪問控制

因此乙個型別別名的訪問級別不可高於原型別的訪問級別

以上規則也適用於滿足協議一致性而給相關型別命名別名的情況

(二十四)訪問者模式

訪問者模式,表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的心操作。dp visitor.cpp 定義控制台應用程式的入口點。訪問者模式,使用於資料結構相對穩定的系統。它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。...

二十四點演算法

給出四個數,不可以重複使用,可以用 和括號,怎麼得出24?return 1 表示當前方法不行 private int workbystep int op,int num1,int num2 else if op 1 else if op 2 else if op 3 只要沒有有小數生成,即使有負數也...

演算法二十四 矩形

給定兩個矩陣,判斷第二個矩陣在第乙個矩陣的哪些位置出現過。輸入的第一行包含四個正整數a,b,c,d,表示第乙個矩陣大小為a b,第二個矩陣的大小為c d。接下來是乙個a b的矩陣。再接下來是乙個c d的矩陣。保證矩陣中每個數字都為正整數且不超過100。若第二個矩陣在第乙個矩陣的 i,j 位置出現 即...