將 Objective-C 代碼遷移到 Swift(Swift 2.0更新)-b

本節內容包括:html

  • 爲你的Objective-c代碼作好遷移準備 (Preparing Your Objective-C Code for Migration)ios

  • 遷移過程(The Migration Process)swift

  • 問題解決提示(Troubleshooting Tips and Reminders)設計模式

遷移工做提供了一個從新審視現有 Objective-C 應用程序的機會,並經過 替換部分Swift 代碼來更好的優化應用程序的架構,邏輯以及性能。換句話說,所謂增量app遷移,就是讓你使用以前的工具-mix and match 來提高相互之間的可操做性。當要選擇哪些特性和功能來用 Swift,哪些依然用 Objective-C 實現時,Mix-and-match讓這一切變得簡單。Swift 和 Objective-C 的互用性又使得將這些功能集成到 Objective-C 變得並不困難。經過這些工具能夠開放 Swift 的擴展功能並集成到現有的 Objective-C 項目中而徹底沒必要馬上使用 Swift 重寫整個項目。xcode

爲你的Objective-C代碼作好遷移準備架構

在開始遷移你的代碼以前,請確保你的 Objective-C 和 Swift 代碼間有着最佳兼容性。這意味着整理並使用 Objective-C 的現代化特性來優化你的現有項目。爲了和 Swift 進行更容易的無縫交互,你的現有代碼須要遵循現代編碼實踐。在開始前,有個簡短的適配練習列表,參看Adopting Mordern Objective-Capp

遷移過程框架

最有效遷移代碼的方式是基於逐個文件,即一次完成一個類。因爲你不能在 Objective-C 中繼承 Swift類, 最好選擇一個沒有子類的(譯者:從類的繼承角度來看,應該先從類族樹的葉子節點開始,自底向上的進行遷移操做)。你就能夠用單個.swift文件來代替對應的.m和.h文件了。你全部的實現代碼和接口將直接放進單個 Swift 文件。你不用再建立頭文件了;Xcode 會在你須要引用的時候自動生成頭文件。(譯者:固然這是在xcode內部機制完成的了,對開發者是透明的)函數

準備工做工具

  • 在 Xcode 中:File>New>File>(iOS 或者 OS X) > Other > Swift 爲對應的 Objective-C.m 和.h文件建立一個 Swift 類。

  • 導入相關係統框架。

  • 若是你但願在 Swift 文件中訪問 Objective-C 代碼的話,能夠填入一個 Objective-C 橋接頭。具體的操做步驟,請看 Importing Code from Within the Same App Target

  • 爲使你的 Swift 類能在 Objective-C 中訪問使用,能夠繼承 Objective-C 類,或者標記上@objc屬性。爲類指定特殊的名稱,以在 Objective-C 中使用,標記上@objc(#name#), <#name#>就是在 Objective-C 中引用的 Swift 類名。 更多信息,請看Swift Type Compatibility

開始工做

  • 你能夠經過繼承 Objective-C 類,適配 Objective-C 協議,或者更多的方式,來讓 Swift 類集成 Objective-C 行爲。更多信息,請看Writing Swift Classes with Objective-C Behavior

  • 當你使用 Objective-C APIs 的時候,你須要知道 Swift 是怎樣來翻譯某些 Objective-C 特性的。更多信息,請看Interacting with Objective-C APIs

  • 當用 Swift 編寫用到 Cocoa 框架的代碼時,記住某些類型是被橋接的,意味着你可使用某些 Swift 類型來替代 Objective-C 類型。更多信息,請看Working with Cocoa Data Types

  • 當你在 Swift 中運用 Cocoa設計模式得時候,請看 Adopting Cocoa Design Patterns獲取更多的通用設計模式的轉換信息。

  • 對於打算將項目從 Objective-C 轉換到 Swfit 的人,請看 Properties

  • 在必要的時候,請爲 Swift 的屬性或方法,經過@objc(<#name#>)屬性來提供 Objective-C 名稱,就像這樣:

1
2
3
4
5
var  enabled: Bool {
     @objc(isEnabled) get {
         /* ... */
     }
}

分別用func和class func來表示 instance(-) 和 class(+) 方法。

聲明簡單的宏來做爲常量,將複雜的宏轉換爲函數。

大功告成

  • 在你的 Objective-C 代碼中更新 import 語句爲 #import "模塊名-Swift.h",可參閱Importing Code from Within the Same App Target中曾有提到。

  • 在Target 的成員選擇框中去掉勾選框來移除原始的 Objective-C.m文件.不要馬上刪除.m和.h文件,以備解決問題用。

  • 若是你給 Swift 類起了一個不一樣的名字,請使用 Swift 類名代替 Objective-C 名。

問題解決提示

儘管對於不一樣的項目,遷移的經歷是不盡相同的,不管怎樣,都有一些通用的步驟和工具能幫你解決代碼遷移時碰到的問題:

  • 記住:你不能在 Objective-C 中繼承 Swift 類。所以,被你遷移的類不能有任何的 Objective-C 子類存在於你的應用中。

  • 當你遷移一個類到 Swift 的時候,你必須從 target 中移除相關的.m文件,以免編譯時提示出現重複的符號等編譯錯誤。

  • 爲了在 Objective-C 中能夠訪問並使用,Swift 類必須是一個 Objective-C 類的子類,或者被標記爲@objc。

  • 當你在 Objective-C 中使用 Swift 代碼的時候,記住 Objective-C 不能理解那些 Swift 的某些特性,請看Using Swift from Objective-C

  • 能夠經過Commond + 單擊一個 Swift 類名來查看它生成的頭文件。

  • 能夠經過Option + 單擊一個符號來查看更詳細的信息,好比它的類型,屬性以及文檔註釋等。

相關文章
相關標籤/搜索