2014-08-29 100 views
21

在Swift中,不需要prefix classes,因爲它們的模塊充當命名空間。前綴擴展函數

什麼是前綴擴展功能?例如:

extension UIImage { 

    public func hnk_hasAlpha() -> Bool { ... } 

} 

一方面,Swift不是動態的,所以碰撞會產生編譯錯誤。

但是,如果編譯後的代碼在未來的iOS/OS X版本中運行,而我的擴展方法之一被添加,會發生什麼情況?即使它們具有相同的簽名,不同模塊中的方法是否會被視爲不同的符號?

如果擴展類是NSObject子類或純Swift類,它會有所作爲嗎?

+0

爲什麼您認爲向Apple提供的課程添加功能是一個好主意?爲什麼不寫一個函數。這對於使用代碼的未來開發者來說很明顯。或子類。 – zaph 2014-08-29 12:03:45

+12

這個問題的技術方面與這個問題的技術方面無關,Swift是如何處理這種碰撞的。也就是說,我認爲擴展Apple類有助於在限制符號範圍的同時爲函數提供更好的上下文,並且實現自定義協議而不訴諸包裝對象等等。 – hpique 2014-08-29 12:37:35

回答

20

有一些微妙的位置:Objective-C的類型

擴展實現Objective-C的類別,與所有的暗示。

但是,Swift類型的擴展只在導入時纔可見。這意味着你不能不小心踩到一個私有系統方法(無論是現在還是將來推出的方法),並且如果系統引入了一個與你的名字相同的公共方法,你將在編譯時失敗你重建,但你現有的應用程序不會中斷。

+0

謝謝。你有資源嗎? – hpique 2014-08-29 22:42:26

+2

不記得了,tbh。開發論壇的一些組合和與迅速開展工作的人交談。 – 2014-08-30 00:20:20

+0

@hpique查看此文檔:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID35 section'擴展。 最後一條語句聲明'您不能使用擴展來覆蓋Objective-C類型上的現有方法或屬性。' 如果發現衝突簽名,編譯器將返回錯誤。 – lukewar 2015-10-26 10:30:56