読者です 読者をやめる 読者になる 読者になる

try! Swift 文化を調和させる #tryswiftconf Day1-8

try! Swift 2016

twitter.com

Swiftでアプリケーションを書くということはObjective-Cで書かれたアプリケーションをただSwiftに書き換えるだけでなく、Swiftの特徴や哲学を受け入れる必要があります。この講演では、標準的なMVCで構成されたテーブルビューを使用したアプリケーションをSwiftに書き換えるところから始まり、よりSwiftらしいコードにするために、関数型プログラミングオブジェクト指向プログラミング、デザインパターンプロトコル指向プログラミングの考え方を適用していきます。

f:id:niwatako:20160302153143j:plain

f:id:niwatako:20160302153154j:plain

OOP(オブジェクト指向) , POP(プロトコル指向), FP(ファンクショナルプログラミング) を融合する

f:id:niwatako:20160302153223j:plain

5枚の手札があってViewControllerに表示する、残念ながらVCはモデルを沢山見ている。

f:id:niwatako:20160302153303j:plain

カードを移動したり出来る。

f:id:niwatako:20160302153310j:plain

f:id:niwatako:20160302153329j:plain

Swiftの気に入っている点はここでプロパティが有ること。VCはモデルについて把握している。+ボタンでActionが呼びだされてカードが増える。 モデルに追加してViewに追加する。ここまでは馴染みがあると思います。これを切り出すとシンプルになる。

f:id:niwatako:20160302153422j:plain

セクションに何行あるのか、テーブルビューを埋める、ランク色スーツを表示する

f:id:niwatako:20160302153441j:plain

削除は追加の逆でモデルから削除してViewからも削除 f:id:niwatako:20160302153518j:plain

これも切り出せる f:id:niwatako:20160302153545j:plain

並び替えはViewは自動ですモデルだけ f:id:niwatako:20160302153600j:plain

モデルはクラスに f:id:niwatako:20160302153619j:plain

このあとstructに変えていくがオブジェクトでやっていく。

f:id:niwatako:20160302153651j:plain テーブルビューを埋めるために何枚有るか確認する必要がある。コンピューテッドプロパティで。

f:id:niwatako:20160302153717j:plain 追加削除移動ができるように。

ここまでは馴染みがありますか?これで満足ですか?

ここから20分でどう展開できるかのお話をする。これが最善とは言わないが、こんなのは如何ということで。


f:id:niwatako:20160302153815j:plain

Model Class ではなくValueTypeにします f:id:niwatako:20160302153839j:plain プロパティはMuteteされる必要があり f:id:niwatako:20160302153846j:plain Handはvar にならなければならない f:id:niwatako:20160302153901j:plain

Mutatingを削除していきます f:id:niwatako:20160302153920j:plain Mutatingの問題はMutating自体ではなくてRefarenceTypeだとAppleは言っている。

f:id:niwatako:20160302154006j:plain 新しいHandのインスタンスを戻すようにする必要がある。Privateで

f:id:niwatako:20160302154033j:plain f:id:niwatako:20160302154052j:plain

Handを追加変更するならViewControllerに戻る必要があり、ストアする必要がある

f:id:niwatako:20160302154117j:plain

f:id:niwatako:20160302154133j:plain カードを動かすにしろ新しい値をアサインする。

Deleteも、あたらしいデッキインスタンスを作る f:id:niwatako:20160302154154j:plain

でもMoveは違う、ここが良い

f:id:niwatako:20160302154233j:plain

これがファンクショナル・アプローチ

f:id:niwatako:20160302154308j:plain

. でチェーンしていく。これはどこにも何もセーブすることはありません。

新しいHandに新しいカードをインサート出来るか聞く。 f:id:niwatako:20160302154358j:plain

これでスマイルにならないならJavaなりRubyなりやればいいと思いますよ?

カスタムセルを作ります f:id:niwatako:20160302154419j:plain

f:id:niwatako:20160302154444j:plain

UITableViewCellのサブクラス。 f:id:niwatako:20160302154458j:plain

ここに書いているコードは実際にはコントローラコードです。

f:id:niwatako:20160302154542j:plain f:id:niwatako:20160302154557j:plain

皆モデルを分かっている状態でよくなく見える?これから良くなる。

f:id:niwatako:20160302154623j:plain

f:id:niwatako:20160302154642j:plain

ViewControllerは適切なCellと話す必要が出る。guard let を使います。 このfatalErrorは起きないはずですが、fatalErrorの何がいいかというと開発段階で問題を把握できるということです。

このここのこーどこのコードは長く見えるかもしれません。モデルに戻りましょう、Subscriptを実装します。 そうするとこう出来る

f:id:niwatako:20160302154755j:plain

DataSoruceをViewControllerから出しましょう f:id:niwatako:20160302154809j:plain

f:id:niwatako:20160302154830j:plain

モデル依存を切り分ける。設計が変わっても実装の変更は必要なくなります。

f:id:niwatako:20160302154904j:plain

すべてのこれらのメソッドをプッシュダウンできます。

f:id:niwatako:20160302154936j:plain

+ボタンを押すとデータソースに渡します。 DetaSourceに誰のTableViewかを知らせる。このレベルでコネクトします。

f:id:niwatako:20160302155030j:plain これらはちょっと違う、引き上げる。Protocolを使います f:id:niwatako:20160302155055j:plain f:id:niwatako:20160302155101j:plain f:id:niwatako:20160302155125j:plain DataSourceをSourceTypeに準拠させる。

Cardという言葉がいっぱいありますね f:id:niwatako:20160302155158j:plain Itemに置き換えます f:id:niwatako:20160302155213j:plain f:id:niwatako:20160302155218j:plain f:id:niwatako:20160302155227j:plain DataTypeがあるとHandを返していたのをSelfを返すようにします。 Handが準拠するならSelfを返す。DataTypeに準拠している者自身。

f:id:niwatako:20160302155332j:plain

f:id:niwatako:20160302155350j:plain f:id:niwatako:20160302155401j:plain f:id:niwatako:20160302155411j:plain ついてきてます?Stopって言ってくれてもいいですよ?

これはあるべきでしょうか f:id:niwatako:20160302155431j:plain

5未満ならDatasourceに上に追加しようと言う。CardではなくてItemにしておきましょう。 f:id:niwatako:20160302155500j:plain

他にデータソースからプルアウト出来ないか?

f:id:niwatako:20160302155536j:plain

テンプレートパターン f:id:niwatako:20160302155558j:plain f:id:niwatako:20160302155602j:plain f:id:niwatako:20160302155613j:plain

f:id:niwatako:20160302155702j:plain f:id:niwatako:20160302155706j:plain f:id:niwatako:20160302155714j:plain f:id:niwatako:20160302155724j:plain f:id:niwatako:20160302155730j:plain

f:id:niwatako:20160302155752j:plain f:id:niwatako:20160302155757j:plain f:id:niwatako:20160302155812j:plain

さて休憩です

f:id:niwatako:20160302155829j:plain

雪の京都です。

さて、何をしましたか、いろんな簡素化しました。変更しないコードを外に追い出しました。 f:id:niwatako:20160302155855j:plain 変更するものを下に持って来ました f:id:niwatako:20160302155903j:plain

f:id:niwatako:20160302155918j:plain OOPだけやるとか、POPだけとかFPだけではなく、全部をやることで調和させました。 ぜひやってみてください。

気に入った記事は はてなブックマーク

はてなブックマークアプリiOS開発チームから来ました! はてなブックマークにはSwift特集があります! 良い記事を見逃さないように、ご利用ください! http://b.hatena.ne.jp/hotentry/it/Swift

そして良いまとめ記事があったらはてなブックマークでブックマークしましょう! try! Swift の記事で盛り上がると嬉しいです!