遷移工作提供了一個(gè)重新審視現(xiàn)有 Objective-C 應(yīng)用程序的機(jī)會(huì),并通過(guò) 替換部分Swift 代碼來(lái)更好的優(yōu)化應(yīng)用程序的架構(gòu),邏輯以及性能。換句話說(shuō),所謂增量app遷移,就是讓你使用之前的工具-mix and match 來(lái)提升相互之間的可操作性。當(dāng)要選擇哪些特性和功能來(lái)用 Swift,哪些依然用 Objective-C 實(shí)現(xiàn)時(shí),Mix-and-match讓這一切變得簡(jiǎn)單。Swift 和 Objective-C 的互用性又使得將這些功能集成到 Objective-C 變得并不困難。通過(guò)這些工具可以開(kāi)放 Swift 的擴(kuò)展功能并集成到現(xiàn)有的 Objective-C 項(xiàng)目中而完全不必立刻使用 Swift 重寫(xiě)整個(gè)項(xiàng)目。
為你的Objective-C代碼做好遷移準(zhǔn)備
在 開(kāi)始遷移你的代碼之前,請(qǐng)確保你的 Objective-C 和 Swift 代碼間有著最佳兼容性。這意味著整理并使用 Objective-C 的現(xiàn)代化特性來(lái)優(yōu)化你的現(xiàn)有項(xiàng)目。為了和 Swift 進(jìn)行更容易的無(wú)縫交互,你的現(xiàn)有代碼需要遵循現(xiàn)代編碼實(shí)踐。在開(kāi)始前,有個(gè)簡(jiǎn)短的適配練習(xí)列表,參看
Adopting Mordern Objective-C。
遷移過(guò)程
最 有效遷移代碼的方式是基于逐個(gè)文件,即一次完成一個(gè)類。由于你不能在 Objective-C 中繼承 Swift類, 最好選擇一個(gè)沒(méi)有子類的。你就可以用單個(gè).swift文件來(lái)代替對(duì) 應(yīng)的.m和.h文件了。你所有的實(shí)現(xiàn)代碼和接口將直接放進(jìn)單個(gè) Swift 文件。你不用再創(chuàng)建頭文件了;Xcode 會(huì)在你需要引用的時(shí)候自動(dòng)生成頭文件。
準(zhǔn)備工作
- 在 Xcode 中:File>New>File>(iOS 或者 OS X) > Other > Swift 為對(duì)應(yīng)的 Objective-C.m 和.h文件創(chuàng)建一個(gè) Swift 類。
- 導(dǎo)入相關(guān)系統(tǒng)框架。
- 如果你希望在 Swift 文件中訪問(wèn) Objective-C 代碼的話,可以填入一個(gè) Objective-C 橋接頭。具體的操作步驟,請(qǐng)看 Importing Code from Within the Same App Target。
- 為 使你的 Swift 類能在 Objective-C 中訪問(wèn)使用,可以繼承 Objective-C 類,或者標(biāo)記上@objc屬性。為類指定特殊的名稱,以在 Objective-C 中使用,標(biāo)記上@objc(#name#), <#name#>就是在 Objective-C 中引用的 Swift 類名。 更多信息,請(qǐng)看Swift Type Compatibility。
開(kāi)始工作
1
2
3
4
5 |
var enabled: Bool {
@objc(isEnabled) get {
/* ... */
}
} |
分別用func和class func來(lái)表示 instance(-) 和 class(+) 方法。
聲明簡(jiǎn)單的宏來(lái)作為常量,將復(fù)雜的宏轉(zhuǎn)換為函數(shù)。
大功告成
- 在你的 Objective-C 代碼中更新 import 語(yǔ)句為 #import "模塊名-Swift.h",可參閱Importing Code from Within the Same App Target中曾有提到。
- 在Target 的成員選擇框中去掉勾選框來(lái)移除原始的 Objective-C.m文件.不要立刻刪除.m和.h文件,以備解決問(wèn)題用。
- 如果你給 Swift 類起了一個(gè)不同的名字,請(qǐng)使用 Swift 類名代替 Objective-C 名。
問(wèn)題解決提示
盡管對(duì)于不同的項(xiàng)目,遷移的經(jīng)歷是不盡相同的,無(wú)論怎樣,都有一些通用的步驟和工具能幫你解決代碼遷移時(shí)碰到的問(wèn)題:
- 記?。耗悴荒茉?Objective-C 中繼承 Swift 類。因此,被你遷移的類不能有任何的 Objective-C 子類存在于你的應(yīng)用中。
- 當(dāng)你遷移一個(gè)類到 Swift 的時(shí)候,你必須從 target 中移除相關(guān)的.m文件,以避免編譯時(shí)提示出現(xiàn)重復(fù)的符號(hào)等編譯錯(cuò)誤。
- 為了在 Objective-C 中可以訪問(wèn)并使用,Swift 類必須是一個(gè) Objective-C 類的子類,或者被標(biāo)記為@objc。
- 當(dāng)你在 Objective-C 中使用 Swift 代碼的時(shí)候,記住 Objective-C 不能理解那些 Swift 的某些特性,請(qǐng)看Using Swift from Objective-C
- 可以通過(guò)Commond + 單擊一個(gè) Swift 類名來(lái)查看它生成的頭文件。
- 可以通過(guò)Option + 單擊一個(gè)符號(hào)來(lái)查看更詳細(xì)的信息,比如它的類型,屬性以及文檔注釋等。
本文版權(quán)歸傳智播客ios培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客ios培訓(xùn)學(xué)院
首發(fā):http://m.metathetuscanyresort.com/ios/