オールアバウトTech Blog

株式会社オールアバウトのエンジニアブログです。

TABLES(タブレス)もSwift 3に対応しました!〜進め方と作業時のエピソード

暑中お見舞い申し上げます、オールアバウト システム部の@sutchanです。 いよいよ秋が近づいてきて、iOSの開発者界隈ではSwift 4の熱が高まってきました。そんな中ではありますが、弊社で開発しているTABLES(タブレス)というアプリのSwift 3化が今年6月に完了しました。夏の終わりに涼しげの、Swift 3化のエピソードをお話したいと思います。

TABLES(タブレス)について

TABLESは、毎日の料理のちょっとした盛り付け、飾り付けに役立つコツ(食卓のレシピ)を共有し合える写真投稿アプリです。今回はSwift 3化のお話がメインですので、こちらご自身でダウンロードの上、読み進めていただけたらと思います!!!

TABLES(タブレス)- おしゃれな食器が見つかるを App Store で

f:id:allabout-techblog:20170828140605p:plain

Swift 3化の進め方

Swift 3化の機運が高まったのは、おそらく春頃でした。すでにXcodeの最新版はSwift 2のサポートを切っておりましたが、Xcodeのバージョンを上げずに開発を続けていました(開発者数と開発量のバランスの問題です)。しかしながら、iOSのバージョンアップにより新しいXcodeでなければ実機転送によるテストができなくなったりと、開発の不都合が増えていたこともあり、思い切ってSwift 3化することになりました。

各種アプリのSwift 3対応

手始めに、いろんなアプリのSwift 3化の話を読みました。

tech.toreta.in

期間 2〜3週間ほどかかりました。

かかるんですね……。

inside.pixiv.net

既存のコードをSwift3化するだけでも大変なのに、新しくマージされたコードもSwift3化していくと、無限に対応が終わらず担当者が疲弊します。 つまり、Swift3対応をしている間は新機能追加やバグフィックスができなくなります。

少なくとも40時間は超えそうということがわかりました。そして、しんどそう……!

TABLESでは……

通常は以下のような手順を行うと思います。

  1. 使用しているOSSライブラリのSwift 3対応状況を確認する
  2. 開発作業を一旦フリーズ(ソースコードを)変更しない
  3. Swift 3にソースコードをコンバート
  4. エラーの除去、警告の除去
  5. テスト

一方、開発者の少ないTABLESでは……

  1. 開発作業は止め(られ)ない
  2. ので、とりあえず、Swift 3にコンバート
  3. エラーが出たライブラリのみ、バージョンアップ
  4. エラーの除去、警告の除去、ライブラリバージョンアップに伴う仕様変更の対応
  5. テスト

上のような手順でSwift 3化しました。ライブラリのSwift 3対応状況を調べるくらいなら、コンバートしてみるほうが早かったんですね……!

Swift 3化で遭遇したエピソードあれこれ♫

おびただしい数のエラー……

Edit > Convert > To Current Swift Syntax…のメニューを、こわいなこわいなーと思いながらクリックすると、自動でアプリのソースコードがどんどんSwift 3に変わっていきます……。
すると……お分かりいただけるだろうか……「999+」のエラーを……!!!

f:id:allabout-techblog:20170824211056p:plain

とまぁ、実際には変更箇所のdiffを確認できますので、よほど間違ったコンバートをしていない限りは、基本的にはacceptする方針で進めていきました。(もちろん変更箇所全部確認しました)
しかしながら、よく使うメソッド(特にdismissViewController, presentViewController)がコンバートされていなかったり、メソッドのラベルがついていなかったりと、エラーを発生させるコンバート不足がいくつも見られました。これらは手で対応する必要がありました……。

消えたNS……

FoundationフレームワークNSがプレフィックスについているクラスの多くは、基本的にNSが取れているようでした。 NeXTコンピュータのNEXTSTEP時代から続くNSが取れたことになり少し感慨でした。

変わっているクラス、いくつか上げておきますね。

Swift 2.3 Swift 3 使用例
NSBundle Bundle NSBundle.mainBundle() → Bundle.main
NSUserDefaults UserDefaults NSUserDefaults.standardUserDefaults() → UserDefaults.standard

一覧はgithubリポジトリで確認できるので、事前に確認しておくとより安心です^^ swift-evolution/0086-drop-foundation-ns.md at master · apple/swift-evolution · GitHub

CocoaPodsのバージョンが低い……

それまでCocoaPods 0.39.0を使用していたものの、いくつかのライブラリはCocoaPodsを1.2.0にアップデートしなければSwift 3版を導入できないことが判明しました。もちろんこれを機に、CocoaPodsのバージョンは1.2.0に!

ちなみに、TABLESでは6つのライブラリをSwift 3版に変更する事になりました。そんなに多くなかった!

f:id:allabout-techblog:20170824210838p:plain

エラーを潰すたびに増えていくエラー数

お分かりいただけるだろうか……エラーが消えたと思ったら、堰を切ったようにエラーが噴出するのである。

78箇所!(T_T)

f:id:allabout-techblog:20170824210742p:plain

(修正してビルドし直すとまたエラーが増えるという現象に悩まされます。)

エラー数が多いとコンパイラが途中で諦めてしまうため、エラー数の総量を知ることが出来ません。よって、エラーを解消して残エラー数が減っていくとあるところでガッツリ増える、ということを繰り返してくことになります

トレタのiPadアプリをSwift 3 対応しましたより引用

なるほど……!

止められない開発……そしてマージへ

TABLESでは、Swift 3化と並行して通常の開発も続けていたので、定期的にmasterブランチを取り込むたびにエラー対応がありました……。これがなかなか大変でした。

ちょうどアプリ側の開発タスクが落ち着き、APICMS、Webサイトのエンハンスに取り掛かっているタイミングがありました。Swift 3対応のブランチは、そのタイミングでマージという運びになりましたとさ!

振り返り

テストも無事おわり、問題なくリリースすることができました。結局、全体としては1ヶ月弱かかりました。 Swift 3化全体の振り返りとしては、以下の4つが挙げられます。

  • 開発をストップして作業できるなら、そうしたほうが良い
  • コンバート後にエラーが出た部分だけ対応するという方法は、それなりに有効
  • 専任の開発者がいるのであれば、専任の人がやったほうが早く済む(当然)
  • テストする項目をあらかじめ用意しておくことが最も大事

(最後に)フロントエンドも、バックエンドも

お分かりいただけただろうか……

アプリ側の開発タスクが落ち着き、APICMS、Webサイトのエンハンスに取り掛かっているタイミングがありました

この記述にあるように、弊社のアプリエンジニアは、フロントエンド(スマホアプリ・Web・CMS)からバックエンド(API)まで、マルチに開発できるエンジニアが揃っています!
そんな弊社にご興味持っていただけましたら幸いですm(_ _)m
エンジニア採用情報はこちらからどうぞ!→ オールアバウトグループのコーポレートサイト - 採用情報

それでは、失礼いたします。