この講演では、Swiftの構造と特性がアプリとUIのコードをより完結に書けるようにしているかということを探っていきます。 私たちは、UIレイヤーを構築する際の一般的な落とし穴と課題を見ていき、それを改善するためのSwiftyな方法を検討します。 Enumを用いたビューの状態のモデリング、有用なサードパーティ製のSwiftライブラリ、プロトコルによるビューの統一などを見ていきます。
UIをSwiftyに書く
小さな会社なのでアプリを1から作ります。
Swiftで
ワクワクしました。
書いているとパターンが見えてきました。パターンがUI関連であることもよく有ります。
今日は4つのパターンを紹介します。
デモをお見せします
シンプルなアプリケーションですがポイントの説明にはこれで十分でしょう。
シュレディンガーの結果
データを取得して返ってくる。失敗したらエラーとともに帰ってくる。
成功化失敗、どちらかが大抵です。
でもありうるな結果はたくさんあります。
ハンドリングするべきは成功失敗の2つ。そこでモデリング化します。
Result
成功したら非オプショナルの型T、失敗したら非オプショナルの型Errorが帰ってきます
ViewControllerがシンプルになりました。
取得した結果を表示することも有りますね。
お気に入りのSwiftらしいやり方でAutoLayoutのお話をします。
layoutSubviews() でレイアウトをするという方法がありますね
でもサイズごとに対応するとほぼ不可能になってしまいますね。
プロダクションコードではStoryboardを使うべきではないという前提でお話をします
マージコンフリクトもあると大変です。アプリの中でUIの中でカラーやフォントを何度も反復することもあります。本来は分解すべきです。色を参照する時に16進数になってしまいます。
プロダクションでStoryboardを使うと文字別で識別されているので強い型付けが台無しです。
どうしてもStoryboardを使う場合にはコード生成ツールが助けになります。
最後にStoryboardに関して、Outletを接続することがコンパイルでは矯正されていません。
つなげてから名前を変更すると実行時にクラッシュします。
Autolayout
CartographyはAutolayoutの制約条件を見事に定義できます。オペレーターのオーバーロードを活用しています。
方程式を書いている。
状態
ロード中か、成功したか、失敗したか
どう管理したら良いでしょうか
ViewControllerでisLoading, isErrorなどのフラグを用意します
素晴らしくはありませんね。
実際に存在する以上の状態を表現しています。APIの結果でも同じことが有りました。
データとフラグを独立して設定することもできます。
フラグが設定されていない場合にのみデータが存在するべきです。
あたいを関連付けしたEnumに似ていますね
ローディング中は何もない、読み込んだらデータが有る、失敗したらエラーが有る
このようなEnumを用意し、欲しい状態でViewを初期化出来る。
ViewはSwitchステートメントで必要な状態に変更します。
Viewの他の箇所では表示非表示を変えることができます。
ViewControllerのコードも簡素になります。
あたいを関連付けしたEnumで状態を表すことでViewのロジックを一元化できます。
Viewの状態管理をもっと簡略化出来るでしょう。
2つ目のViewControllerは3つの同じView状態を取るようです
APIを叩き、ロードし、データを表示する。
いつも3つの状態を辿っているのであればそれぞれのViewを基本的な実装を決めて表示非表示を一括で実装できたら便利ではないでしょうか
プロトコルを利用すると良いでしょう。
プロトコルは何を用意する必要があるでしょうか
update関数のデフォルト実装を作ることが出来るようになります。
エラービューを提供し、ローディングビューを提供し、データをセットできるようにして、適切なタイミングでupdate()をコールすれば良い。
この物語の教訓は何でしょうか
プロトコルにすることでコードの反復を減らせます
- データとエラーの操作の仕方を簡単に区別できるようになります
- Autolayoutの可読性にCartgraphyを紹介しました
- ViewStateのバグを回避できるEnumを用意しました
- プロトコル指向のプログラミングによりコードの重複を回避しました
Q&A
あなたの考えでは、Enum以外の方法はお使いになったことは有りますか?GenericなViewControllerを作成したり、Enumを使って関連付けられた値を使っていますか?
ほとんど一般化されたEnumを使っています。GenericなViewControllerも利用しています。 ピークパターン、アクションパターンなどを分解してオブジェクトにしてぽぴゅれーとする方法とか、他の方法も検討しています。Enumはお気に入りで一般的な反復されるコードを簡略化出来るのでパターンとして利用しています。