標籤:
在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)的影響