Swift中的存取修飾詞對於擴充(extension)的影響

來源:互聯網
上載者:User

標籤:

在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

Swift中的存取修飾詞對於擴充(extension)的影響

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.