2017年9月17日日曜日

Objective-CのコードをSwiftに移植

Swift3にもなって、そろそろObjective-Cで作ったアプリをSwift化した方がいいと思うようになった。

メンテナンスのたびにObjective-Cを思い出しながら作業するのも面倒。
いつアップルが「もうObjective-Cのサポートやめるから、これからは審査通さんからね」って言い出しかねない。
なんだかんだ言ってObjective-Cのコードはごちゃごちゃしてることが多い。ヘッダファイルやimportも必要だし。

そんなわけで今さらだが、Swiftに移植してみることにした。

以下、調べたことのメモ

  • 同じプロジェクト内でクラスのファイル(ViewController.h、同.mとか)ごとに移行可能。
  • クラスのファイル名は拡張子が別になるので、Objective-CとSwiftで同居可能。(ViewController.h、同.m、同.swift)
  • 最初にSwiftファイルを追加するときに「アプリ名-Bridging-Header.h」というファイルを作るかどうか聞かれるので、作っておく。

手順

移行するクラスファイルと同名のSwiftファイルを作ってコードを移植。
Objective-Cの.hと.mのファイルを削除。
Storyboardに結びついてるならCustom ClassのModuleがNoneになってるので、そこをプロジェクト名に直す。(最初にCurrentに直すとも?)
IBOutletやIBActionの結びつきを直す。

Objective-C、Swift相互の呼び出し

Objective-CのクラスからSwiftのクラスを呼ぶ

Objective-CのクラスからSwiftのクラスを呼ぶには、呼び出し元のObjective-Cの実装ファイル(.m)
#import "アプリ名-Swift.h"
を追加。
たとえばアプリ名がMyAppだったら
#import "MyApp-Swift.h"
とする。

ただ、なんかうまく認識してくれないことがあって、よくわかんねえんだ…。(´・ω・`*)
importしたら、すぐにそのクラスを認識してコードのサジェスト(推薦候補)を表示してくれるようになるわけじゃないようで、一度ビルドかけるとようやく認識してくれたり。それでも認識されなかったり。
このあたりはもっとしっかり作ってくれるといいんだけどね、Xcode。どうせSwiftへ移行する過渡期だけの仕様だから、いい加減なのかねえ?

SwiftからObjective-Cを呼ぶ

逆にSwiftからObjective-Cを呼ぶには作っておいた「プロジェクト名-Bridging-Header.h」に呼び出し先のObjective-Cファイルをimportする。

でいいらしい。

AppDelegateの移植

AppDelegateも同様に移植する。

main.mの削除

Objective-CではSupportingFilesフォルダ中にmain.mが作られてるけど、これが残ってるとかえってエラーになるので、削除する。

@UIApplicationMain

Swiftの普通のAppDelegateを参考にすりゃわかるけど、class AppDelegateの前に@UIApplicationMainってのを書いてやる。
多分これで最初に呼ばれるファイルに指定されるんだろう。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

0 件のコメント:

コメントを投稿