事始め
世の中にはベストプラクティスと銘打つ記事が沢山あるようなので集めてみました。
iOS関係のベストプラクティス関係の記事
- SwiftのOptionalのベストプラクティス
- NSRunLoopを立ち上げるベストプラクティス
- アイスタイル的 iOS設計ベストプラクティス
- iOSアプリ開発時の実ファイルの配置ベストプラクティス
- [iOS] Swift時代の! コードによるViewレイアウトのベストプラクティス
- [Swift] Property のベストプラクティスを考える
- Auto Layoutの設計ベストプラクティスと、Viewの種類ごとのテクニック集
- iOSのトラッキング実装ベストプラクティスを考える
- ライブラリ・SDKにSwiftLintを導入するベストプラクティス
- Apple公式 アプリ改善のベストプラクティス
自分なりのiOSアプリ開発ベストプラクティスについて
Optionalについて
Optionalは「値が存在しない可能性がある場合」or「エラーで値の取得などに失敗する可能性がある場合」に使用します。Optionalであるにも関わらず「値が必ず存在する」と保証できる場合はforced unwrapをし、それ以外はOptional ChainingかOptional Bindingで適切に処理を行うのが望ましいです。
ベストプラクティスの記事にはなるべくOptional Bindingですぐに処理をすることが推奨されていますが、該当メソッドで必要になる値を取り出す過程全てでOptional Bindingするよりは、全てOptional Chainingで取り出してから、最後の必要になる値のところでOptional Bindingして、それに失敗した場合に必要になる値が取れなかった旨を返すのが妥当なところだと思います。
// 全てOptional Bindingするパターン
guard let foo = ... else { ... }
guard let bar = foo.bar else { ... }
guard let baz = bar.map { Baz($0) } else { ... } // 以降は`baz` を使う処理
// ↑こちらだと全てのnilケースについて細かくエラーハンドリングする感じになる(理屈的には正しいが、ほとんどの場合はコード全体が長くなりがち)
// 必要な箇所でOptional Bindingするパターン
guard let baz = foo?.bar?.map { Baz($0) } else { ... } // 以降は`baz` を使う処理
// ↑こちらだと必要なbazが取れないという旨だけエラーハンドリングする感じになる
実ファイル配置について
よくModel/View/ViewControllerのMVCに区別して配置するパターンが見受けられますが、個人的にはModel/View+ViewControllerで区別し、View+ViewControllerの配下には画面ごとでフォルダを作って管理するのがやりやすいと感じています。
その一番の理由が、ViewControllerとViewはよく行き来しながら修正を行うので、プロジェクト上での配置位置が同じディレクトリにある方が開きやすいという点にあります。また、ViewModelを作ったりするとそれをどこに入れるのかとか迷ったりしがちですが、ViewとViewControllerの配置を一緒くたにしておけば大体みんなViewModelを作っても同じ配下に入れてくれる感じがします。
画面関係とロジックを分けるということさえ徹底しておけば、ディレクトリ構成を細かく分けていく必要性は個人的にはあまりないと思います。
コードによるViewレイアウトについて
- UIViewController#viewが持つsubviewのレイアウトはviewDidLayoutSubviewsの中で行う
- CustomViewが持つsubviewのレイアウトはlayoutSubviewsの中で行う ほぼほぼ上記2行は同意ですし、これ以上言うことはほとんどないですが、viewDidLayoutSubviewsではなくviewWillLayoutSubviewsでレイアウトを決めることもよくあります。viewDidLayoutSubviewsではレイアウトが終わった後でのframe設定になってしまうので、挙動によってはviewWillLayoutSubviewsの方が望ましいこともあります。
Auto Layoutについて
個人的にはViewControllerの直接の子のviewだけ親viewに対してConstraintをかけて、その下のviewはコードでlayoutSubviewsに書くか、小さいxibに分けてちゃんとConstraintかけるのが良いように思います。一つのstoryboard/xibに多くのconstraintが含まれないように気をつけるのが個人的なベストプラクティスだと考えています。