コネヒト開発者ブログ

コネヒト開発者ブログ

iOS版ママリの開発環境をXcode10.2/Swift5にアップデートしました

はじめまして、2019年5月に入社したiOSアプリエンジニアのあぼ(@suxisuxido)です。入社後は『既存チーム』と呼ばれる、ママリアプリの既存機能の改良などを行うチームで、iOS側の開発を担当しています。

コネヒトでは先日、iOSの開発環境をXcode10.1/Swift4.2から、Xcode10.2/Swift5にアップデートしました。今回はそのことについて書こうと思います。

ライブラリのAPI変更への対応

各種ライブラリのバージョンアップに伴い、コードの変更が必要です。ワーニング解消も含めると、RxSwiftまわりの変更が一番多かったです。

RxSwift.VariableをRxRelay.BehaviorRelayに変更

便利なVariableはRxSwift4.0.0-rc.0からdeprecatedになっています。今回のタイミングで、同様の使い方ができるRxRelayのBehaviorRelayに変更しました。

- import RxSwift
+ import RxRelay

- let isConnecting = Variable(false)
+ let isConnecting = BehaviorRelay(value: false)

- isConnecting.value = true
+ isConnecting.accept(true)

https://github.com/ReactiveX/RxSwift/releases/tag/4.0.0-rc.0

throttleやdelayオペレーターの引数をTimeInterval からDispatchTimeIntervalに変更

こちらはRxSwift5からdeprecatedになっています。もともとDouble型で計算した結果を使っていた場合はロジックの変更が必要ですね。

- throttle(1.2)
+ throttle(.milliseconds(1200))

- throttle(3)
+ throttle(.seconds(3))

https://github.com/ReactiveX/RxSwift/releases/tag/5.0.0

Swift5の新機能Raw stringsの利用

Swift5の機能のひとつ、Raw stringsを使って、正規表現から"\"のエスケープを削除しました。

- NSRegularExpression(pattern: "^(\\d+)歳")
+ NSRegularExpression(pattern: #"^(\d+)歳"#)

正規表現はどうしてもバックスラッシュが多くなりがちなので、積極的にRaw stringsを使ってスマートに書いていきたいですね!

https://github.com/apple/swift-evolution/blob/master/proposals/0200-raw-string-escaping.md

Xcode10.2ではiOS12.2のデバッグが可能に

じつはこのとき、いくつかの検証端末が意図せずiOS12.2に上がってしまっていたため、Xcode10.1のままではデバッグができず不便でした...。

Xcode10.2にあげたことによってiOS12.2のデバッグが可能になり、弊iOSチームは救われました(´・∀・`)

https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_release_notes

モンキーテストの実施

一通り対応が終わったら、既存チームでモンキーテストを行いました。

Xcode10.2/Swift5対応がアプリへもたらす影響範囲は大きく、かつ私自身はまだママリアプリの機能について知識が少なくデグレにも気づきづらいので、知識ある人に触ってもらって怪しいところを事前に拾うのが狙いです。

結果的にこのモンキーテストで1つデグレが見つかったので、やっておいてよかったな〜と思っています。

f:id:aboy_perry:20190722160533p:plain
モンキーテストご協力のお願いのようす

おわりに

影響範囲が大きく、気を張って行う必要があるという意味ではそこそこ大変でした。このほかにも、単体テストで保証しやすいのに実際にはテストが書かれていなかった箇所に、単体テストを追加したりしました。

こういう開発環境アップデートは遅くなればなるほどあとからやるのが大変になったりしますし、そのあいだ新機能が使えないままなので、タイミングをみて今回実施できてほんとによかったです!