完全なObjective-CアプリをSwiftに変換するためのステップバイステップガイド
公開: 2018-03-142014年にリリースされて以来、Appleのプログラミング言語Swiftは驚異的な成長を遂げてきました。 プログラミング言語は、その前身であるObjective-Cとその地位を共有し、トップ10プログラミング言語の雑用の中でその地位を確立することに成功しました。 しかし、迅速な対客観的なCの戦争は決して落ち着きません。
この人気の高まりとエキサイティングな機能により、以前はObj-Cを使用していた多くのiOSアプリケーション開発者がSwiftプログラミング言語に切り替えました。 実際、iOS向けのSwiftまたはObjective-Cの戦いの中で、LinkedIn、Yahoo Weather、Hipmunk、LyftなどのさまざまなiOSアプリがすでにObjective-CからSwiftにアップグレードされており、多くの人がObjective-Cアプリの変換を計画しています。スウィフトに。
より良いオプションを迅速に作成する要因
個人的には、最初のバージョンが発表されてからSwiftの進化を見てきました。SwiftとCの間では、 SwiftがObjective-Cに取って代わります。
オープンソース
Swiftはオープンソース言語であり、SwiftコードはObjective-Cよりもはるかに多くのプラットフォームに移植できます。
スピード
Swift for iOS開発は、LLVMコンパイラーと連携し、既存のコードの再利用、未使用のリソースの根絶、インライン関数の管理などを行うことができる静的型付け言語です。 その上、その動作は、C ++の最速のアルゴリズム計算演算の1つに基づいており、前任者よりも競争力があることが証明されています。
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アプリをビルドする場合、開発者はビルド時間とコード効率を高めるために2つの異なるコードファイルを維持することになっています。 ただし、Swiftはこの2つのファイルのメカニズムを廃止し、Objective-Cヘッダー(.h)と実装ファイル(.m)を1つのファイル(.swift)にマージしました。 LLVMコンパイラーは、Swiftファイルの読み取り中に依存関係を自動的に検出します。これは、iOSアプリケーション開発者にとって大きなメリットです。
上記の要因とは別に、他のAppleのプログラミング言語よりもSwiftを選択することの価値のある利点は、Objective-Cとの互換性です。 Appleは、アプリ開発者に同じプロジェクトで両方の言語を使用する機能を提供しています。 これは、Swiftを使用してiOSアプリを最初から開発する場合だけでなく、Objective-Cコードを使用して既存のアプリをSwiftにアップグレードする場合にも役立ちます。
これで、2つのiOSアプリケーション開発言語の哲学的な違いに精通しましたが、実際の実装では違いに移りましょう。
SWIFT VS OBJECTIVE-C:IOS開発のタイタン間の大きな違い
複雑なObjective-CコードベースとSwiftコードベースの経験から、アプリ開発プロセスを迅速に行うさまざまな新しい要素の紹介とともに、既存の概念に対するいくつかのアップグレードに出くわすでしょう。 面倒なことをせずに、迅速な対客観的な戦争であなたが新しい/異なると思うすべてを見てみましょう。
オプション
迅速なパフォーマンスとObjective-Cのパフォーマンスについて話すとき、nilオブジェクトのメソッドを呼び出して、Obj-Cでゼロ値を取得できます。 予期しないnil値が発生した場合の未定義の動作を理解するには、手動でnilチェックを実行する必要があります。 ただし、この問題は、Swiftコードで導入された新しい概念であるOptionalを使用することで解決できます。 オプションを使用すると、意味のある値を返すことができない可能性のある関数が、オプションまたはnilにカプセル化された値を返すことができます。
オプション型を宣言する構文は次のとおりです。
パブリック列挙型オプション<ラップ>:_ Reflectable、NilLiteralConvertible
実際には、ラップされたタイプの値または存在しない値のいずれかを持つことができます。
Swiftは、型をオプションとして宣言するためのシンタックスシュガーをレンダリングするため、Optional <String>をString?に置き換えることができます。
オプションのコンテナからラップされた値を取得するには、主に2つの方法があります。
オプションの連鎖:if-let条件ステートメントが値が存在する場合にのみ値を受け取る場合に使用されます。
強制ラッピング:オプションの宣言された変数がnil以外の場合に使用されます。 値が存在する場合、条件を実装せずに出力を提供します。 ただし、それ以外の場合はクラッシュします。
Stringとして宣言されたSwift言語で暗黙的にアンラップされたオプションを見つけることもできます!
例えば:
クラスXClass
{{
var aString:文字列
var bString:文字列!
var cString:文字列?
Init(文字列:文字列)
{{
aString =文字列
}
}
ここ、
文字列をnilにすることはできません。 オブジェクトの初期化中にこの変数に値があることが重要です。そうしないと、プログラムがクラッシュします。
B文字列はnilにすることができます。 ただし、nilオブジェクトにアクセスしようとすると、プログラムがクラッシュします。
C文字列はnilにすることができ、通常のオプション変数として扱われることになっています。
拡張機能
Obj-Cにある拡張機能とカテゴリは、Swift言語の拡張機能という単一のエンティティに統合されています。 拡張機能は、既存のクラス、列挙、構造、またはプロトコルに新しい機能を追加します。最良の部分は、型を拡張するために元のソースコードにアクセスする必要がないことです。
タプル
オプションに加えて、Appleの新しい開発言語で導入された別の新しいデータ型はタプルです。 タプル(ユーザー定義のデータ型を使用)は、基本的に、多くの値を1つの複合グループにグループ化すると見なされます。 ある場所でモデルを作成するのはやり過ぎかもしれないし、辞書が十分に読みやすいものではないと思うかどうかを検討するのは正しい要素です。 より多くのタプルを知るには、このブログを参照してください。
ジェネリック
ジェネリックスはSwiftプログラミング言語の最も印象的な機能の1つであり、実際、Swift標準ライブラリの多くはSwiftコードで作成されています。 ジェネリックコードを使用すると、開発者は、定義された要件に応じて、さまざまなタイプのセットで動作できる柔軟で再利用可能な関数とタイプを記述できます。 これにより、重複のリスクが最小限に抑えられ、明確で抽象化されたアプローチでコードの可読性が向上します。
私の経験によると、再帰のように、ジェネリックは最初は取得するのが難しいです。 しかし、それを手に入れると、面倒な論理的な問題を修正するというまったく新しい世界を解き放つことができます。
列挙
Objective-Cコードでは、列挙はプリミティブ型に制限されています。 整数の列挙値を文字列の値にマッピングして出力を表示するには、配列を導入するか、スイッチの制御構造に目を向ける必要があります。 ただし、SwiftiOSアプリ開発言語でこれらの面倒を経験する必要はありません。
Swiftは、より多くのオプションを備えたさまざまな新しい列挙型を提供します。 Swift列挙型には値を関連付けることができ、Swift列挙型の場合は事前定義されたフィールドのセットを保持できます。 実際、Swift列挙は再帰的であり、生の値を格納できます。
例えば:
下付き文字
下付き文字は、メソッドを使用せずに、クラス、列挙型、および構造内のシーケンス、コレクション、またはリストからの情報にアクセスするための媒体と見なすことができます。 保存と取得のための個別のメソッドを作成せずに、インデックスによって値を設定および取得するための添え字を検討できます。 たとえば、Arrayインスタンスの要素にsomeArray [index]としてアクセスし、Dictionaryインスタンスの要素にsomeDictionary [key]としてアクセスできます。
下付き文字を宣言するための構文は次のとおりです。
下付き文字(インデックス:Int)-> Int {
得る {
//添え字値を宣言するため
}
set(newValue){
//値を定義するため
}
}
型推論
Swiftは、iOSアプリケーション開発の型安全性も提案しました。これによれば、特定の型で宣言された場合、その型は静的で変更できません。 コンパイラーは、割り当てられた値に基づいて、変数がどのタイプになるかを決定(または推測)します。
例えば:
ここで、str2変数に数値で初期化しようとすると、コンパイラーはエラーを表示します(以下を参照)。
機能
Swiftプログラミング言語の関数構文は、複雑なObjective-Cコードスタイルの関数構文よりも柔軟に定義できます。 Swiftでは、すべての関数に関数のパラメーター型で構成される型があり、型を返します。これは、関数を変数に割り当てたり、値として他の関数に渡したりできることを意味します(以下の例を参照)。
これとは別に、Swiftでは、アプリ開発者が機能パラメーターのデフォルト値を定義することもできます。
エラー処理
Swiftは、実行時に回復可能なエラーをスロー、キャッチ、循環、および操作するためのまったく新しいアプローチを提供します。 Swiftでのエラー処理を垣間見るには、ブログを参照してください。
これらとは別に、Swiftアプリ開発をObjective-Cアプリ開発よりも有利にするさまざまな概念は次のとおりです。
モデル
Swiftの場合、モデルはクラスではなく構造体であることが推奨されます。
プロトコル
最初のAppleWWDCビデオでは、swiftが「プロトコル指向言語」として導入されました。 プロトコルは、特定のタスク/機能に適したメソッド、プロパティ、およびその他のエンティティの青写真として定義できます。 これらは、クラス、列挙、または構造に取り入れて、これらの要件の実際の実装を容易にすることができ、デフォルトの実装を提供したり、ジェネリックを組み込んだりする機能を備えたObjCと比較してはるかに強力です。
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をアップグレードするのではなく、新しい言語を発表した主な理由です。 これらすべての点を考慮して、Obj-CからSwiftへの行ごとの変換ではなく、Swiftで新しいアプリを最初から作成することを強くお勧めします。
それでも、完全なObjective-CアプリをSwiftに変換したい場合、使用できるツールの1つはSwiftifyです。 このツールは、Obj-CコードをAppleの新しいプログラミング言語にワンクリックでアップグレードするプロセスを容易にします。 何千もの労働時間を節約します。 相互運用性の機能により、変換されたiOSコードを面倒なことなくObjective-Cに統合できます。つまり、Swiftが提供する無数のオプションを調べて、すべてを一度に書き直すことなく、Obj-Cプロジェクトに統合できます。
変換用に既存のアプリコードを準備します
最新のObj-Cコードから始めることをお勧めします。 これは、Xcodeが次の点で役立つ最新のObjective-Cコンバーターを利用しているためです。
1.可能な限りidをinstancetypeに変更します
2.正しい列挙型マクロを使用する
3.最新の@property構文へのアップグレード
コンバーターは、潜在的な変更の分析と適用のメカニズムを支援しますが、コードのセマンティクスを示していません。 したがって、すべてのiOSアプリケーション開発者は、すべてを手動で一度確認してから、変更を確認することをお勧めします。
コンバーターを使用するには、[編集]-> [リファクタリング]-> [最新のObjective-C構文に変更]を選択します。
Objective-CコードをSwiftに移行するプロセス
完全なObjective-CアプリをSwiftに変換するための最も効果的なアプローチは、最初に、一度に1つのクラス、特にObj-CでSwiftクラスをサブクラス化できないため、サブクラスのないクラスです。
クラスに関連する.mファイルと.hファイルを単一の.swiftファイルに置き換えます。 これにより、インターフェースから実装まですべてが自動的にSwiftファイルに入ります。 さらに、必要に応じてXcodeがヘッダーを自動的に生成するため、ヘッダーファイルを作成する必要はありません。
ブリッジヘッダーファイルの設計
最初の.swiftファイルを追加すると、次のようなプロンプトが表示されます。
[ブリッジヘッダーの作成]オプションをクリックします。
ステップバイステップガイド
1.Swiftに変換する.hファイルと.mファイルのペアを選択します。 プロジェクト全体を変換する場合は、後で使用するためにAppDelegateクラスを残します。
2.コード全体で#import“ MyViewController.h”を検索し、Objective-Cブリッジヘッダーファイル([MyProject] -Bridging-Header.h)から削除します。
3.すべての.mファイルで#import“ [filename] .h”のインスタンスを#import“ [MyProject] -Swift.h”に置き換え、#import“ [filename] .h”の代わりに@class [filename]を配置します。すべての.hファイル。
4.Obj-Cファイルの一部をSwiftに変換します。 これは、「SwiftifyforXcode」のFinder拡張機能を使用して簡単に実行できます。 それ以外の場合は、.mファイルと.hファイルの内容を.swiftにコピーし、SwiftifyXcode拡張機能で使用可能な「ファイルをSwiftに変換」オプションを使用します。
5.プロジェクト内の.hファイルと.mファイルを変換された.swiftファイルに置き換えます。
6.プロジェクトをコンパイルし、変換エラーを修正します。 多くの問題はXcodeの自動修正の提案を使用して簡単に管理できますが、プロジェクトに数回表示されるエラーを報告して修正するためにSwiftifyを利用することもできます。
7.完了したら、プロジェクトをビルドして実行します。 「クラスが見つかりません」という問題が発生した後にクラッシュする場合は、ストーリーボードエディタでそのクラスへのすべての参照を見つけてください。 Identity Inspectorにクラス名を再入力し、保存して再試行してください。
8.プロジェクト全体を変換する場合は、AppDelegateクラスを今すぐ変換できます。 この時点で、他のすべてのファイルはSwiftに変換されているため、ターゲットにObj-Cファイルが残っていない場合は、main.mおよび.pch(プリコンパイル済みヘッダー)ファイルを簡単に削除できます。
どちらの方法が好きですか?Swiftで新しいiOSアプリを最初から作成するか、Objective-CをSwiftに完全に変換しますか? 以下のコメントセクションを介してあなたの意見を共有してください。