Swift中的訪問修飾符對於擴展(extension)的影響


在Swift中,有一種結構extension,類似於OC中的Category分類,非常適合於對代碼進行管理

同時,常用的訪問修飾符有public、internal、private,而對於這三個訪問修飾符,對extension的影響是各不一樣的

在本文中,我將對同一文件下和不同文件下的extension、在本類和其他類調用,共四種情況進行分別介紹。

在介紹前,我先創建了一個非常簡單的iOS項目,並新建了一個Person類和Person類的extension文件,如下圖:

其中,Person類的代碼如下:

Person+Extension文件中的代碼如下:

從上面的代碼可以看到,在Person類本文件中的extension創建了兩個函數,分別是getAge()和getGender()

在Person+Extension文件中創建了兩個函數,叫sayHello()和sayGoodBye()

而具體的測試,將分別在Person本類的printSomething()和ViewController類的viewDidLoad()兩個函數中分別進行

1、internal

internal是一個作用域介於public和private之間的訪問修飾符,也是swift中默認的訪問修飾符,通常是直接省略的

internal既不像public那么有開放性,也不像private那么封閉

a.同一文件下的extension,在其他類中調用:

在ViewController文件中直接調用Person類本文件extension中的方法如下:

可以很清楚的看到,是可以很直接的調用到這個函數的

b.不同文件下的extension,在其他類中調用:

接下來調用Person+Extension的sayHello()函數:

在這種情況下,非同一文件下的extension中的函數也是可以調用到的

c.同一文件下的extension,在本類中調用:

在Person類中測試結果如下:

d.不同文件下的extension,在本類中調用:

在Person類中測試結果如下:

結論:在internal或無修飾符情況下,不論extension中的函數和類文件是否在同一文件中,均可以順利調用執行

2、private

private在各個編程語言中都表示私有方法/函數,在此我們均嘗試一下使用private后兩種情況下的extension函數

在開始前先

a.同一文件下的extension,在其他類中調用:

根據測試,即使是extension與類在同一文件中,在ViewController中也無法調用到被private修飾的函數getGender()

b.不同文件下的extension,在其他類中調用:

測試后結果顯示,extension與類在不同文件中的情況下,ViewController同樣無法調用到被private修飾的函數sayGoodBye()

c.同一文件下的extension,在本類中調用:

經測試,在此情況下,本類可以調用到與類在同一文件下的extension中被private修飾的函數

d.不同文件下的extension,在本類中調用:

測試結果顯示,與類不在同一文件的extension中的被private修飾的函數,即使在本類中也無法調用

結論:在private修飾的extension函數中,僅有與類在同一文件的可以被順利調用,其他情況下均無法被調用

3、public

public因其開放性,在任何位置均可以調用被public修飾的方法/函數,因此通常用於全局性的變量、屬性或者方法。

在測試前將原來沒有使用訪問修飾符的getAge()和sayHello()函數前分別加上public修飾符。

而實際測試中,直接在方法前加上public修飾符會提示警告如下:

針對這種情況,Xcode編譯器建議將public替換為internal,為解決這個問題,必須在類聲明前也加上public才可以

即證明:只有在public修飾的類中才可以存在被public修飾的函數

經修改后繼續測試,測試結果依次如下:

a.同一文件下的extension,在其他類中調用:

b.不同文件下的extension,在其他類中調用:

c.同一文件下的extension,在本類中調用:

d.不同文件下的extension,在本類中調用:

結論:被public修飾的函數,不論是否與本類在同一文件,在本類和其他類中均可以被調用

綜上所有結論如下:

訪問修飾符 同一文件,其他類調用 不同文件,其他類調用 同一文件,本類調用 不同文件,本類調用
internal 可以被調用 可以被調用 可以被調用 可以被調用
private 不可以 不可以 可以被調用 不可以
public 可以被調用 可以被調用 可以被調用 可以被調用

 

 

 

 

表格注釋:同一文件和不同文件僅代表函數所在extension是否與所在類是同一個文件

 

參考文章:https://github.com/bboyfeiyu/iOS-tech-frontier/blob/master/issue-4/Swift擴展的三個微妙細節.md


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM