將完整的 Objective-C 應用程序轉換為 Swift 的分步指南

已發表: 2018-03-14

自 2014 年發布以來,Apple 的編程語言 Swift 經歷了驚人的增長。 該編程語言已成功躋身前 10 大編程語言之列與其前身 Objective-C 共享這一位置。 但是 swift 與 Objective-C 的戰爭從未平息。

隨著這種流行度和令人興奮的功能的增加,許多以前使用 Obj-C 的 iOS 應用程序開發人員已經轉向 Swift 編程語言。 事實上,在 iOS 的 swift 或 Objective-C 之爭中,LinkedIn、Yahoo Weather、Hipmunk 和 Lyft 等各種 iOS 應用程序已經從 Objective-C 升級到 Swift,而許多人正計劃轉換一個 Objective-C 應用程序到斯威夫特。

使 SWIFT 成為更好選擇的因素

就我個人而言,自從第一個版本發布以來,我已經看到了 Swift 的演變,我可以說在 swift 與 C 之間, Swift 取代了 Objective-C基於以下因素,比如

開源

Swift 是一種開源語言,Swift 的代碼可以移植到比 Objective-C 更多的平台上。

速度

Swift for iOS 開發是一種靜態類型語言,它與 LLVM 編譯器一起工作,可以重用現有代碼、消除未使用的資源、管理內聯函數等。 此外,它的工作基於 C++ 最快的算法計算算法之一,這反過來證明了它比其前身俱有競爭優勢。

根據 Apple 的說法和我的經驗,Swift 搜索算法比 Objective-C 快 2.6 倍。

可讀性

與 Objective-C 不同,Swift 不依賴於 C 基礎。 它使 iOS 開發人員能夠刪除嵌套的方法調用、在行尾跳過分號、避免將 @ 放在關鍵字的開頭、使用“+”號連接字符串等等。 此外,Swift 類沒有分為接口和實現部分。 這將代碼長度減少到近一半,使其更具可讀性。

例如,當 Lyft 應用程序從頭開始用 Swift 語言重寫時,應用程序代碼從 75,000 行減少到 25,000 行。 這個令人印象深刻的數字減少了開發人員的工作量,而不會影響應用程序在客戶端的性能。

交互式編碼

憑藉其 Playgrounds 功能,它可以讓程序員編寫大量代碼或算法,同時在開發階段收集反饋。 由於 Swift 代碼是使用數據可視化編寫的,這使得應用程序開發過程更加容易和平易近人。

安全

Swift 是一種更安全、更安全的語言,用於根據當前市場趨勢構建應用程序。 它的語法和語言結構排除了使用 Objective-C 語言編碼時常見的錯誤類型。 這意味著應用程序崩潰和出現問題行為的可能性較小。

與 Objective-C 的情況不同,用 Swift 編寫的代碼可以編譯,並且可以修復錯誤,以及代碼編寫部分。 因此,與測試 Objective-C 代碼的過程相比,Swift 在測試過程中表現得更好更快。

維護

由於 Swift 不像其前身那樣依賴於 C,因此 Swift 應用程序開發的維護要容易得多。 Swift 成為 iOS 應用程序開發未來的原因

在使用 Objective-C 構建 iOS 應用程序的情況下,開發人員應該維護兩個不同的代碼文件以提高構建時間和代碼效率。 然而,Swift 放棄了這種雙文件機制,將 Objective-C 頭文件 (.h) 和實現文件 (.m) 合併到一個文件 (.swift) 中。 LLVM 編譯器在讀取 Swift 文件時自動發現依賴關係,這對 iOS 應用程序開發人員來說是一個很大的好處。

除了上述因素之外,選擇 Swift 而不是其他 Apple 編程語言的值得一提的好處是它與 Objective-C 的兼容性。 Apple 為應用程序開發人員提供了在同一個項目中使用兩種語言的便利。 這不僅有助於從頭開始使用 Swift 開發 iOS 應用程序,而且有助於使用 Objective-C 代碼將現有應用程序升級到 Swift。

雖然您現在已經熟悉了兩種 iOS 應用程序開發語言之間的哲學差異,但讓我們在實際實現中轉向差異。

SWIFT VS OBJECTIVE-C:IOS 開發巨頭之間的主要區別

憑藉我在復雜的 Objective-C 代碼庫和 Swift 代碼庫方面的經驗,您將遇到對現有概念的多次升級以及對各種新元素的介紹,這些元素使應用程序的開發過程更加迅速。 事不宜遲,讓我們來看看在 swift vs Objective c 的戰爭中你會發現新的/不同的一切。

可選的

當我們談論 swift 與 Objective-C 的性能時,我們可以在 nil 對像上調用方法來獲得 Obj-C 中的零值。 如果出現意外的 nil 值,我們必須手動執行 nil 檢查以了解未定義的行為。 然而,這個問題可以通過使用 Optional 來解決,這是 Swift 代碼中引入的一個新概念。 Optional 允許可能無法返回有意義的值的函數返回封裝在 optional 或 nil 中的值。

聲明 Optional 類型的語法是:

公共枚舉 Optional<Wrapped> :_Reflectable, NilLiteralConvertible

實際上,它可以具有 Wrapped 類型的值或不存在的值。

Swift 渲染了聲明類型可選的語法糖,所以我們可以用 String? 替換 Optional<String>

主要有兩種方法可以從可選容器中獲取包裝值:

可選鏈接:用於 if-let 條件語句僅在存在時才接收值的情況。
強制包裝:當可選的聲明變量為非零時使用。 如果該值存在,它將在不執行條件的情況下提供輸出。 但是,在另一種情況下,它會崩潰。
我們還可以在 Swift 語言中找到隱式展開的可選項,聲明為 String!

例如:

X類

{

var aString: 字符串

var bString:字符串!

var cString: 字符串?

初始化(字符串:字符串)

{

aString = 字符串

}

}

這裡,

字符串永遠不能為零。 這個變量在對像初始化的時候有一個值是至關重要的,否則程序會導致崩潰。
B 字符串可以為零。 但是,如果您嘗試訪問 nil 對象,程序將會崩潰。
C String 可以為 nil,並且應該被視為常規可選變量。
擴展
Obj-C 中的擴展和類別被合併到一個實體中,即 Swift 語言中的擴展。 擴展為現有的類、枚舉、結構或協議添加了新功能,最好的部分是您無需訪問原始源代碼即可擴展類型。

元組
除了 Optionals,Apple 新開發語言中引入的另一種新數據類型是元組。 元組(就地用戶定義的數據類型)基本上被認為將許多值分組到一個複合組中。 如果您認為在某個地方創建模型可能會矯枉過正並且字典對讀者不夠友好,那麼這是需要考慮的正確因素。 要了解更多元組,請參閱此博客

泛型
泛型是 Swift 編程語言最顯著的特性之一,事實上,許多 Swift 標準庫都是用 Swift 代碼創建的。 通用代碼讓開發人員可以編寫靈活的、可重用的函數和類型,這些函數和類型可以與不同的類型集一起工作,但要符合定義的要求。 這最大限度地減少了重複的風險,並通過清晰、抽象的方法增強了代碼的可讀性。

根據我的經驗,泛型一開始很難得到,就像遞歸一樣。 但是,當你掌握它時,你將能夠打開一個解決令人厭煩的邏輯問題的全新世界。

枚舉
在 Objective-C 代碼中,枚舉僅限於原始類型。 為了將整數枚舉值映射到顯示輸出的字符串,您必須引入一個數組或轉向開關控制結構。 但是,您無需使用 Swift iOS 應用程序開發語言來解決這些麻煩。

Swift 提供了多種新枚舉以及更多選項。 Swift 枚舉可以有關聯的值,Swift 枚舉 case 可以保存一組預定義的字段。 事實上,Swift 枚舉可以是遞歸的並且可以存儲原始值。

例如:
代碼

下標
下標可以被看作是在不使用方法的情況下從類、枚舉和結構中的序列、集合或列表中訪問信息的媒介。 您可以考慮使用下標按索引設置和檢索值,而無需創建單獨的存儲和檢索方法。 例如,您可以將 Array 實例中的元素作為 someArray[index] 訪問,將 Dictionary 實例中的元素作為 someDictionary[key] 訪問。

聲明下標的語法如下:

下標(索引:Int)-> Int {

得到 {

//用於聲明下標值

}

設置(新值){

//用於定義值

}

}

類型推斷

Swift 還為 iOS 應用程序開發提出了類型安全性,根據這種安全性,變量聲明為特定類型時,其類型將是靜態且不可更改的。 編譯器將根據您分配的值確定(或推斷)您的變量將是什麼類型。

例如:

代碼 1
在這裡,當您嘗試將數值初始化為 str2 變量時,編譯器將顯示錯誤(見下文)

代碼 03

職能
Swift 編程語言中的 Function 語法比複雜的 Objective-C 代碼風格更靈活。 在 Swift 中,每個函數都有一個類型,該類型由函數的參數類型和返回類型組成,這意味著您可以將函數分配給變量或將其作為值傳遞給其他函數(如下例所示):

代碼圖像

除此之外,Swift 還允許應用程序開發人員為功能參數定義默認值。

錯誤處理
Swift 提供了一種全新的方法來在運行時拋出、捕獲、循環和操作可恢復的錯誤。 要了解 Swift 中的錯誤處理,請參閱博客。

除此之外,使 Swift 應用程序開發比 Objective-C 應用程序開發雙贏的各種概念是:

楷模
在 Swift 的情況下,模型更喜歡是結構而不是類。

協議
在第一個 Apple WWDC 視頻中,swift 被介紹為“面向協議的語言”。 協議可以定義為適合特定任務/功能的方法、屬性和其他實體的藍圖。 它們可以被類、枚舉或結構所包含,以促進這些需求的實際實現,並且與 Obj C 相比更強大,具有提供默認實現、合併泛型等特性。

作為一名 iOS 應用程序開發人員,我更喜歡在定義類之前創建一個協議,這是利用 Apple 高級編程語言優勢的最有效做法。

函數式編程方法
與使用傳統的循環或引用類型相比,Swift 使開發人員能夠使用更多的函數式方法來解決平凡的問題。 在這裡,觀點是根據解決方案來分析問題,而不是像傳統方法那樣確定如何獲得解決方案。

根據我對這兩種 iOS 語言的經驗,我注意到的一件事是,我們在 Objective-C 中使用 for 循環的迭代所做的事情可以使用 Swift 中的 Filter、Map 和 Reduce 的概念來完成。 要深入了解函數式編程中的這些高階函數,請參閱博客。

將完整的 OBJECTIVE-C 應用程序轉換為 SWIFT 的分步指南

今天,有各種工具可以將應用程序從 Objective-C 逐行轉換為 Swift。 但是,我建議不要使用任何。 儘管這兩種 iOS 語言都是可互操作的,但它們的程序範式是不同的。 將應用程序從 Obj-C 直接遷移到 Swift 會帶來更高的使用錯誤範例的風險。 讓我詳細說明一下。

與其前身不同,Swift 受到函數式編程範式的影響,這使得它嚴重依賴於不變性。 例如,如果你談論數組和字典——這些基本模型在 Objective-C 中曾經是一個引用類型,但在 Swift 中它們是值類型,因此是不可變的。 這意味著使用任何工具下意識地將 Obj-C 代碼轉換為 Swift 將使您面臨大量難以調試的錯誤。 此外,Swift 有大量的新特性(如上所述),它們可以讓算法/方法更高效,編程更快捷! 事實上,這也是 Apple 推出新語言而不是升級 Obj-C 的主要原因。 考慮到所有這些點,我強烈建議大家從頭開始用 Swift 編寫一個新的應用程序,而不是從 Obj-C 到 Swift 的逐行轉換。

不過,如果您希望將完整的 Objective-C 應用程序轉換為 Swift,您可以使用的一個工具是 Swiftify。 該工具簡化了將 Obj-C 代碼一鍵升級為 Apple 新編程語言的過程; 節省數千小時的工作時間。 互操作性的特性可以輕鬆地將轉換後的 iOS 代碼集成回 Objective-C,這意味著您可以探索 Swift 提供的無數選項,然後將其集成回您的 Obj-C 項目,而無需一次重寫所有內容。

為轉換準備現有應用代碼
從最新的 Obj-C 代碼開始總是更好。 這是因為 Xcode 使用了現代的 Objective-C 轉換器,它可以幫助您:

1. 盡可能將 id 更改為 instancetype
2. 使用正確的枚舉宏
3. 升級到更新的@property 語法

雖然轉換器有助於分析和應用潛在更改的機制,但它並不描述代碼的語義。 因此,建議所有 iOS 應用程序開發人員手動檢查所有內容,然後確認更改。

要使用轉換器,請選擇Edit -> Refactor -> Change to Modern Objective-C syntax。

將 Objective-C 代碼遷移到 Swift 的過程
將一個完整的 Objective-C 應用程序轉換為 Swift 最有效的方法是,首先,一次一個類,尤其是一個沒有任何子類的類,因為您不能在 Obj-C 中對 Swift 類進行子類化。

將與類相關的 .m 和 .h 文件替換為單個 .swift 文件。 這樣,從接口到實現的所有內容都將自動進入 Swift 文件。 此外,如果需要,您不需要創建頭文件,因為 Xcode 會自動生成頭文件。

設計橋接頭文件
當您添加第一個 .swift 文件時,您會發現如下所示的提示。

快速代碼12

單擊“創建橋接頭”選項。

分步指南

1. 選擇一對要轉換成 Swift 的 .h 和 .m 文件。 如果要轉換整個項目,請將 AppDelegate 類留待以後使用。
2. 在整個代碼中搜索#import “MyViewController.h”並將其從Objective-C Bridging Header 文件([MyProject]-Bridging-Header.h)中刪除。
3. 將所有 .m 文件中的 #import “[filename].h” 實例替換為 #import “[MyProject]-Swift.h” 並將 @class [filename] 而不是 #import “[filename].h” 放入所有 .h 文件。
4、將部分Obj-C文件轉換為Swift。 這可以使用“Swiftify for Xcode”的 Finder 擴展輕鬆完成。 否則,將 .m 和 .h 文件的內容複製到 .swift 並使用 Swiftify Xcode 擴展中提供的“將文件轉換為 Swift”選項。
5. 將項目中的 .h 和 .m 文件替換為轉換後的 .swift 文件。
6. 編譯工程並修復轉換錯誤。 雖然使用 Xcode 自動修復建議可以輕鬆管理許多問題,但您也可以依靠 Swiftify 報告和修復項目中多次出現的錯誤。
7. 完成後,構建並運行項目。 如果出現“找不到類”然後崩潰的問題,請在情節提要編輯器中找到對它的所有引用。 在 Identity Inspector 中重新輸入類名,保存並重試。
8. 如果要轉換整個項目,現在可以轉換 AppDelegate 類。 此時,所有其他文件都已轉換為 Swift,因此,如果目標中沒有 Obj-C 文件,您可以輕鬆刪除 main.m 和 .pch(預編譯頭)文件。

你更喜歡哪種做法——從頭開始用 Swift 創建一個新的 iOS 應用程序,還是將 Objective-C 完全轉換為 Swift? 通過下面的評論部分分享您的觀點。