Daniel Eggert
写真を愛し、ベルリンに住んでいます。objc.ioの共同設立者の一人です。10年以上、Cocoaに関係する全て(主に写真や画像処理)に関わって仕事をしています。5年間Appleで働き、Photos.appとCamera.appをCore Dataに移行する仕事をしました。
Swiftを使い、古いObjective-CのAPIに新たな命を吹き込みます。
コアデータそのものの話ではないです。既存APIを近代的Swiftコードで使う。
ローランのセッション、読めるコードを書こうというのを覚えていますか
読みやすいコード、エラーしにくいコードを作りたいと思います。
ProtocolとProtocol Extensionを使います
CoreDataは12年の歴史がありObjective-Cで作られダイナミックでタイプセーフでないので良い題材。
昨年書きました
既存APIのスピリットを維持したい。
簡単に使えるようにしたい。
エンてティとクラスがカップリングされています
エンティティとクラスは1対1でマッピングされます。ObjCの歴史もあってコードが変に見えます こうなりますよね
- 長い
- Stringになっててコンパイラが働かない
- !になってる(←??)
CityエンティティとCityClassをひも付けました
タイプキャストも出来て一箇所にまとまった
シンプルに
KVO
タイプミスをしやすい、タイプセーフでない、そこがよくない。
従来のやり方
ポイントとしては引数を渡すとストリングになってこう使う
コンパイラが使えない。それがクラッシュになる。
こんなにKeyをつかう
改善しましょう
コンパイラチェック出来ます
ネスト化されたタイプでKeyはCityに属している。
プロトコルを活用
StringではなくKeyをとっていて
コンパイラがチェックしてくれる
Fetchリクエストを良くする
こうできたらよい
同じプロトコルで
ロジカルなオーダリングクラスをうまくつなげていける
Fetchがよくなる
1行になった
とてもクリーンで読みやすい
Predicateを使うが
これも改善
ValueTransformerについて
サブクラスも必要でSwiftらしくない
StringをUUIDに変えていきたい
そのままでもそんなに悪くないが
まだ改善の余地はある
どのタイプに変えるかは伝えていない、推論される。
2つのスライドで解説します
とてもSwifty!
Blockはここ5,6年、使いやすくなったのはSwiftでてからですね
Saveを見てみます
シンプルだがもっと改善
チェンジを一つのブロックにラッピング。変更書けたところが見える。読みやすい。
UIApplicaitonAPIにはいろいろ簡素化してくれるものがあると思います、小さなラッパでも多くの機能を提供します。
DidChangeでリアクティブアプローチが可能になる。変更で、誰が何故変えたのか、通知が行われます。コードとUIのアップデートがタイアップされてる
こんな形でやっていましたね。実装する度出てきました。
これも簡単に
読みやすいですよね。Cityが変更された時にNameラベルを変更します。
実装方法ですが、大枠の局面から見ていきます。このヘルパで通知を確認します。
最後の行原っぱを使うということを示す。これでタイプセーフになっている。
ラップをするというノーティフィケーションのみ。
コードが突然こういうものを使い始めてSwift的に使いやすくなっていく。
幾つか例を示しました。
まとめ
小さなヘルパーになるが人生がもっと楽になる。あなただけではなくリーダーも皆さんが楽になる。
古いAPIは確認済みなので使うことは良いこと。バグがない。でも改善してより生きやすくなる。
実装時の精神を大切にしたい。私たちが作ったものをコードとして読みやすいものにしていく。
QA
CoreData、Swiftについて質問があったらQAルームへどうぞ。クリスの質問はもう受けない(・ω<)
クリスさん)実験的に私もやったがCoreDataについてあまり知らないから、SwiftライクだがCoreDataを失うことにならないか?
Swiftのスラックに入れるが、CoreDataは多くのキャッシングをします。パフォーマンスのメリットが有る。アプリが大きい時にはやらないほうがいい、パフォーマンスが悪くなる。
existing ですね、exittingはダメですね。既存APIがなくなることはないですね。CoreDataのコード自体は何千ものiOSのアプリ、Macアプリにも使われています。なのでこれに関してバグフィックスが累積していて安定している。Appleが何かしていまのCoreDataに到達するなら2028年ぐらいでは??
新たに作るなら他のソリューションもあるのでJobに適切なものを選ぶのが良いでしょう。
Core Dataとvalue typeだとこういうライブラリもある #tryswiftconf https://t.co/5C5GZklUIe
— Syo Ikeda / いけしょー (@ikesyo) 2016年3月3日
そもそも歴史を戦ってきた古いコードは安心して使えるから、少し便利・型安全にしてあげれば、もっと便利になっていくよという話と捉えてもよいかも。 #tryswiftconf
— Hirohito Kato ⌘ (@hkato193) 2016年3月3日
CoreData、あんまり使ったことないからなあ、と思って聞いてたけど、CoreDataの話と言うよりむしろ、CoreDataを題材にして古いAPIを如何にType safeにしていくか、という話でよかった #tryswiftconf
— ぎぎにゃん (@giginet) 2016年3月3日
オリジナルの実装の精神を保つ、というのは同感。過剰なラッパーは良くない。 #tryswiftconf
— 宇佐見 公輔 (@usamik26) 2016年3月3日
https://t.co/uhzQgG3h7W 今の方が書いた100% SwiftなCore Data本はこれ。 #tryswiftconf ちなみに日本の100% SwiftなCore Data本は https://t.co/B1FhZkTuD5 こちらが。
— Hirohito Kato ⌘ (@hkato193) 2016年3月3日
「歴史あるコードをType safetyにするプラクティス "モダンCore Data"とは? #tryswiftconf」をトゥギャりました。 https://t.co/TGVbbczNYh
— トゥギャッター開発まとめ (@tg__dev) 2016年3月3日
気に入った記事は はてなブックマーク
はてなブックマークアプリiOS開発チームから来ました! はてなブックマークにはSwift特集があります! 良い記事を見逃さないように、ご利用ください! http://b.hatena.ne.jp/hotentry/it/Swift
そして良いまとめ記事があったらはてなブックマークでブックマークしましょう! try! Swift の記事で盛り上がると嬉しいです!