Promise in Swift by PromiseKit
Swift 勉強会 2015/05/25 Yuta Shimizu
自己紹介
• 清水 雄太 twitter: @pachirel
• クックパッドで新規サービス開発担当
• 初めての新規サービス開発を通して学んでいること
• 半年前にSwiftはじめました
Swift勉強会初参加
• どんなモヒカンがいらっしゃっているのかとdkdkしてます
なぜPromise使うのか
• コールバックつらい
• 例外処理つらい
作っていたアプリ
• バックエンドがいわゆる普通のRESTクライアント
• 画面単位のAPIがないので、1画面毎に複数のリクエストを生成する必要がある
• リクエストの管理が煩雑
PromiseKit導入の理由
• objcの他プロジェクトで導入実績があった
• 2014/10当時、swift版がリリースされていた
• 開発が(主に一人だけど)アクティブ
• 最近ではSwiftTaskが良さそうと聞く
Promiseの簡単な説明
• javascriptのPromise/A+がベース
• then, catch, finally
• pending, fulfilled, rejected
• ライブラリによって機能が異なる
PromiseKitの追加機能• あまり多くない
• when
• 複数のPromiseの並列実行
• after
• 一定時間後にPromiseを実行
• Promise(on: thread), zalgo, walgo
• 実行するThreadを変更できる
• ちゃんと理解して使わないと危ない(使ってません)
実際に導入してみて
• コードの見通しが良くなった
• エラー処理がすっきり書ける
• when等は使わず、then, catch finallyで事足りた
PromiseKitのはまりどころ• 構文エラー回避に慣れが必要
• クロージャの型は省略しないのがオススメ
• catchし忘れても気づかない
• catch忘れのログは出るが、見落としがち
• thenを書いたら絶対catch!
PromiseKit 2.0が最近リリース
• 本体コードがswiftに移行
• recover
• cancellation
• Obj-c <=> Swift 対応(AnyPromise)
Recover• エラーを処理したあと、次のchainに繋ぐ
AnyPromise
• Objective-cとの互換性
• 1.x時代に実装された各種ライブラリに対応したobj-cカテゴリが使える。
@noescape• Swift 1.2で追加されたattribute
• ブロックを引数に取る関数を定義するときにつけると、使用時にクロージャ内でself.が省略できる
Optional + Enum + Switch
DebugPrintable protocol
_ + デフォルト引数
• Swiftだとそ最後の引数のブロックの名前を省略できるけれど、親切っぽい
関心事でextensionに分ける
まとめ
• PromiseKit使ってSwiftでPromiseライフ
• PromiseKit 2.0はコンパクトな実装
• OSS実装を読むと学びが大きい/(書けばもっと・・)
出展
• http://promisekit.org/introduction/
• http://promisekit.org/PromiseKit-2.0-Released/