iOS開発の主流言語のひとつにSwiftがあります。
iOS開発のスキルセットには何が必要だろう?!そんな疑問にお答えするべく、今回はSwiftに注目し、iOS開発の最近の動向をご紹介します。
はじめに
iOS開発の従来のネイティブ言語と言えばObjective-Cでしたが、2014年にSwiftが発表されて以降、Swiftでの開発が増えてきております。
Swiftの学習は、英語の動画教材が多く、学習コストは比較的高い分類にあたると考えます。対して、参考書は日本語のものも多く、独学される方も参考書から取り組まれることが多いかと思います。
Swift開発は、Storyboard開発とCodebase開発に大別されると思います。
Storyboard開発
Storyboard開発のメリットはUIを視覚的に作成できることでありiOS開発での基本になります。デメリットは色々な場所に設定が散らばってしまい、必要な情報が隠れやすく流用がしづらいということです。
Codebase開発
Codebase開発のメリットはコードで記述するため、Viewを定義しているファイルをコピーしたり、Viewを利用するコードを書くだけで流用できることです。デメリットは設計パターンやデザインパターンの設計知識が必要となり学習コストが高い傾向にあります。
今回は当社で取り組んでいるSwift開発におけるスキル習得を中心にご紹介します。
ベーシックスキル
Storyboard開発
Storyboard開発では、StoryboardファイルとXIBファイルを用いて、画面レイアウトと画面遷移を開発します。AutoLayoutを用いることで、種類の多いiOS端末の各画面サイズに応じてレイアウト調整する制約を設定することができます。
設計パターン
設計パターンとしてはMVCかMVPが選択されます。MVP開発ではテストしやすい TDD サイクルを回せる点がメリットです。ViewとModelを完全に独立させてPresenterで結ぶMVP(Passive View)が多いと思います。関数をUIイベントに関連付ける際に@IBActionを使用します。
デバッグ
Swift開発のIDEにはXcodeを使用します。Xcodeにはシミュレータがありアプリの動作確認を行えます。Xcodeではブレークポイントを設定することもできるのでデバッグをし易い環境が整っています。
データ型
Swiftのデータ型にはオプショナル型があります。iOSではnilに対して操作することでアプリケーションが落ちてしまうアプリクラッシュがあります。そのような問題を解決するためにSwiftではnilを基本的には許容しません。しかし、オプショナル型を使うことでnilを扱うことができるようになります。
デザインパターン
MVP開発のデザインパターンとしては、ClosureCallbackパターンやProtocolDelegateパターンがよく使用されます。
ClosureCallbackパターンでは、完了後の処理をクロージャーで受け取り、そのコールバック用のクロージャーを実行することで通知します。ClosureCallbackパターンは通知完了後の処理を呼び出しメソッドの近くに書けるため可読性が高くなります。
ProtocolDelegateパターンでは、処理の流れは決まっているけれど、条件などによって処理内容を変えたい、ということが簡単に実現することができます。ただ、UIKitでDelegateを使用するときには注意が必要です。開発者の実装コードはDelegateでイベント実行されますが、TableViewを表示する機能はUIKitに内包されるコードが実行される点を意識する必要があります。
API通信
API通信では、以前はObjectMapperを使用してマッピング定義に基づいてモデルへマッピングを行うライブラリ利用が主流でしたが、Codableの流れもあってAlamofireを使ってAPIのコール処理を実装することが多い状況です。JSONを構造体へDecodableを使って読込を実装します。
チーム開発
チーム開発では、ソース管理にGitを用います。
GitFlowだけでなく、GitHubFlow / GitLabFlowにてリモートレポジトリへのプルリクエストにてレビューを依頼するのが主流です。StoryboardファイルもGitの管理下に置くことができます。見やすさの観点から1~5画面ごとにStoryboardファイルを1つつくるなどチームの開発標準を規定します。
ミドルスキル
Codebase開発
Codebase開発ではUIもコードで実装することを意識します。画面遷移を含めてUIとアクションをコードで実装します。コードベースで開発するときのメリットは大きく、差分がわかりやすくコードレビューし易い、プルリクエスト後にマージする際にもコンフリクトが起きにくい、UIViewControllerの再利用や継承をし易い、Interface Builderを使わないことから動作が軽い、コードであるため再利用や移行し易い特徴があります。
設計パターン
設計パターンとしてはMVVMが選択されます。データバインディングという形でViewとViewModelを結びつけます。UI操作にてデータ側を書き換えます。Observableを外部から注入することでタップのテストもし易くなります。
MVVMには、RxSwiftを使わないNotification Centerで実装する方法もありますが、MVVMの主流となるのは、RxSwiftを使って外部ライブラリで実装する方法です。
RxCocoaを導入することで、UIKitをReactive Extensionsのパーツとして扱うことができコードベースでUIを記述できます。また、RxSwiftを導入することで、View( UIView/UIViewController )の制御を非同期で記述でき、イベント/データストリーム(時系列処理)を実装できます。
RxSwiftの拡張ライブラリー
RxSwiftの拡張ライブラリーとして例を挙げるならば次の三例をご紹介します。
RxDataSources UITableViewやUICollectionViewをDelegateの負担少なく実装できます。
RxKeyboard キーボードのframe値の変化を容易に購読できます。
RxOptional Optionalな値が流れるストリームに対して、nil値の置き換えや、nilが流れてきた時にerrorを流すことができます。
デザインパターン
MVVM開発のデザインパターンとしては、ClosureCallbackパターンやProtocolDelegateパターンだけでなく、Observerパターンを実装できます。
Observerパターンでは、Observable通知イベントをObserverクロージャが受取処理でき、非同期処理を実装できます。この際、Operatorを設定でき、通知イベントの 変換・絞り込み・組み合わせ などを実装できます。
API通信
MVVM開発ではAlamofireのラッパーとなるMoyaの利用も増えています。Moyaは公式にRxSwiftに対応しています。API通信ではEitherの形でレスポンスが返ってきます。それを自分たちでRxに変換するコードをわざわざ書いているのであれば、Moyaを使って必要な開発にリソースを割いた方がいいでしょう。MVVM開発にてMoyaの利用機会は今後も増えていきそうです。
最近の動向
Flux
設計パターンとしてはMVVM開発が主流になりつつありますが、更にモダンな環境では設計パターンにFluxの導入が検討されます。複雑な状態を管理したいときに単一方向のデータフローとなるFluxの考え方を導入します。FluxはViewControllerの責務を細分化し、状態の変化の流れを明示的にしてくれるので、アプリケーションの状態が把握しやすくなります。
SwiftUI
Appleがコードベースの開発を推奨してからは、SwiftUIを用いたコードベースで開発することが検討されます。
SwiftUIは、Storyboard と比べるとコードでUIを記述できることから実装の移植工数が大幅に削減されます。チーム開発におけるコードレビューも差分を検知し易くなります。
一方で、UIKit だと簡単に使えるAPI がSwiftUI では用意されていないことがあります。現状では、機能の実装やトラブルシューティングのためにUIKitの知識が必要になります。SwiftUIは、将来、iOS 13以降をターゲットとする際に使用機会が増えてくると考えます。
まとめ
グロシードでは顧客要件を実現するiOS開発に取り組んでおります。
MVP開発をはじめ、MVVM開発、VIPPER開発に注力しております。
ネイティブエンジニア募集中でございます。こちらも見ていただけましたら幸いです。
最近swiftを勉強してる初学者です。
開発スタイルに関して混同してる所にこのような良記事があり大変参考になりました。
特にStoryboard開発とコードベース開発で切り口を変えているので分かりやすかったです。
両者で設計パターン、デザインパターンの相違は大変参考になりました。
最近ではswiftUIが主流なのでしょうか?(円グラフの大きさも変化している?)
記事作成から数年経過しているので可能なら最新動向に更新していただけますと幸いです。
有難う御座いました。