Objective CアプリをSwiftに移行する方法 (1)

私の開発したメモ帳のような足し算アプリ「Sums Up」をObjective CからSwiftに書き換えた時の体験談です。

https://appsto.re/jp/FBd-6.i

【大まかな流れ】

・.hファイル、.mファイルに相当する.swiftファイルを追加する。

・変換ツールを使って.h、.mファイル内のコードをSwiftに書き換え、.swiftファイルに貼り付ける

・エラーが出た場合は手直しする

・必要があればStoryboardと.swiftファイル内のIBOutlet、IBActionを繋ぎ直す

・AppDelegateを新規のswiftプロジェクトからコピーする

・.h、.mファイルの中身を全てコメントアウトして無効にし、.mainと移行中に発生したbridging-header.hファイルを削除する。

【もう少し具体的な手順】

・Fileメニューから > New > File > Cocoa Touch Class > Nextの順に進む

・Class = .mファイルと同じ名前にする

Subclass of = .mファイルと同じクラスにする

Language: Swift

・Nextを押すと「Would you like to configure an Objective-C bridging header?」と訊かれるので、Yesを選びます。これはObjective CのプロジェクトにSwiftファイルを追加して、両言語を混在させたいときに両者の間の橋渡しをするヘッダーファイルです。今回は完全にSwiftに移行したいので後で削除するのですが、移行途中、つまりまだObjective CベースのViewControllerが他に残っていても、アプリを走らせてテストしたかったので追加しました。

・コードをObjective CからSwiftに書き換えるのには以下のサイトを使いました。

https://objectivec2swift.com/#/converter/

無料で変換できるのは1000文字までで、.hファイルは収まっても、mファイル丸ごとは無理でした。有料プランも考えたのですが、まず第一に私がケチなのと(笑)、後から分かったことですが、どの道手直しが必要になるので、コードを少しずつ(メソッドごとかもっと狭い範囲で)コピペして、このサイトとXcodeを行き来しました。他のツールも試しましたが、やり方が悪かったのか上手く行かず、途中で嫌になってやめました。

・全てのViewControllerをSwift化してからテストしようとすると、大量のコンパイルエラーを先に解決しなければならないのでお勧めしません。私の場合は合計で約200個のエラーを手作業で取り除かなければなりませんでした。

・比較的シンプルな作りのViewControllerをまず1つSwiftに書き換えて、Objective Cの方(.hと.m)をコメントアウトして(ショートカットは⌘/です)、プロジェクトを実行して動作を確認してから次のViewControllerに取り掛かるようにしました。この時、Objective CクラスからSwiftクラスを呼ぶにはObjective Cクラスのヘッダーに

#import “<#YourProjectName#>-Swift.h”

を追加します。逆にSwiftからObjective Cを呼ぶときは、YourProject-Bridging-Header.hに以下を加えます。

#import “YourObjectiveCClass.h”

出展: Stack Overflow

・AppDelegateをSwift化します。やりかたは

File > New > File > Cocoa Touch Class > Next

Class: AppDelegate

Subclass: UIResponder

Language: Swift

Nextを押す

これでAppDelegate.h、.mファイルをコメントアウトして上手く走ればOKですが、ダメな場合はSwiftで新規プロジェクトを作成して、そのAppDelegate.swiftからコピペするのが良いでしょう。

・元のAppDelegate.mに書き加えたメソッドなどもSwiftに書き換えてAppDelegate.swiftに書き加えます。

・AppDelegateがSwiftになったのでmain.mを削除します。

・全てのクラス、ViewControllerがSwiftに書き換えられたら、不要になったYourApp-Bridging-Header.hも削除します。


理屈ではこれでSwiftへの移行が完了するわけですが、エラーがなくなったとしても、Objective Cの時とは挙動が変わってしまっていることがあります。次回はそのことについて書きます。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s