swift與oc的互用--代碼遷移

轉自譯者:@xudeheng (git 主頁)

遷移工作正好提供了一個重新審視現有 Objective-C 應用程序的機會,也可以通過 Swift 代碼來更好的優化應用程序的體系架構,邏輯以及性能。直接的說,你將用先前學到的 mix and match 以及這兩個語言間的互操作性來進行增量遷移工作。Mix-and-match 功能使得選擇哪些特性和功能來用 Swift 來實現,哪些依然用 Objective-C 來實現變得簡單。Swift Objective-C 的互用性又使得將這些功能集成到 Objective-C 變得並不困難。通過這些工具可以開放 Swift 的擴展功能並集成到現有的 Objective-C 項目中而完全不必立刻使用 Swift 重寫整個項目。


爲你的 Objective-C 代碼遷移做好準備

在開始遷移你的代碼之前,請確保你的 Objective-C Swift 代碼間有着最佳兼容性。這意味着整理並使用 Objective-C 的現代化特性來優化你的現有項目。爲了和 Swift 進行更容易的無縫交互,你的現有代碼需要遵循現代編碼實踐。 


遷移過程

最有效遷移代碼的方式是基於逐個文件的方式,即一次完成一個類。由於你不能在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 withObjective-C Behavior

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

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

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

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

  •   在必要的時候,請爲 Swift 的屬性或方法,通過@objc(<#name#>)屬性來提供

    Objective-C 名稱,就像這樣:

    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 + 點擊 一個符號來查看更詳細的信息,比如它的類型,屬性以及文

    檔註釋等。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章