APIKit

20
Swi$ らしい API クライアント ! APIKit を使う ! 宇佐見 公輔 @usamik26

Transcript of APIKit

Page 1: APIKit

Swi$%らしい%API%クライアント!"APIKit"を使う"!宇佐見!公輔!@usamik26

Page 2: APIKit

宇佐見!公輔!@usamik26• フェンリル株式会社"iOS"アプリプログラマ

• WWDC"2015"参加

• Objec1ve3C"好き

• Swi5"最近好きになった

• Haskell"勉強中

Page 3: APIKit
Page 5: APIKit

APIKit• Swi%&で&Web&API&クライアント実装をするためのライブラリ

• h.ps://github.com/ishkawa/APIKit

• 3&月の&potato>ps&でご本人による紹介

• その後、仕様変更&バージョンアップ

• 実案件で採用しました

Page 6: APIKit

APIKit'を使ったコード

Page 7: APIKit

API$を使う側のコードlet request = HogeApi.Endpoint.Login(user: "hoge", pass: "hoge")HogeApi.sendRequest(request) { response in switch response { case .Success(let box): let loginResponse = box.value // 正常レスポンス ... case .Failure(let box): let error = box.value // NSError ...

Page 8: APIKit

API$を実装する側のコード$(1)

class HogeApi: API { override class var baseURL: NSURL { return NSURL(string: "https://hogehoge/api")! } class Endpoint { // この中に各エンドポイントのクラスを実装します // 今回は別ファイルに分けて extension で実装しました }}

Page 9: APIKit

API$を実装する側のコード$(2)extension HogeApi.Endpoint { class Login: Request { let user: String let pass: String var URLRequest: NSURLRequest? { return HogeApi.URLRequest(method: .GET, path: "login", parameters: ["user": user, "pass": pass]) } typealias Response = LoginResponse static func responseFromObject(object: AnyObject) -> Response? { return LoginResponse(object) } ...}

Page 10: APIKit

API$を実装する側のコード$(3)extension HogeApi.Endpoint { ... class LoginResponse { let json: JSON // SwiftyJSON let token: String init (_ object: AnyObject) { let json = JSON(object) self.json = json self.token = json["token"].stringValue } }}

Page 11: APIKit

APIKit'の利点

Page 12: APIKit

従来のパターン• API%の%comple,on%handler%に、response%と%error%が両方ある

• response%:%成功時のレスポンス

• error%:%失敗時のエラー

Page 13: APIKit

従来パターンの問題点

Page 14: APIKit

APIKit'のコード(再掲)let request = HogeApi.Endpoint.Login(user: "hoge", pass: "hoge")HogeApi.sendRequest(request) { response in switch response { case .Success(let box): let loginResponse = box.value // LoginResponse ... case .Failure(let box): let error = box.value // NSError ...

Page 15: APIKit

APIKit'の利点

Page 16: APIKit

an#typical/Result/の活用enum Result<T, E> { case Success(Box<T>) case Failure(Box<E>)}

• response"は"Result<T.Response, NSError>"型

• .Success"のとき"LoginResponse"型

• .Failure"のとき"NSError"型

Page 17: APIKit

Designed(for(Safety

Page 18: APIKit

Designed(for(Safety• Swi%&の特徴のひとつ

• C&言語が「プログラマを信用する」思想であるのと対照的

• 例えば&Op*onal&はこの特徴を実現するためのキー機能のひとつ

• Op*onal&型を&unwrap&しないと普通の型として扱えない

• null&参照がなくなって安全

Page 19: APIKit

APIKit'の利点• レスポンスが明確で不明な状態がない

• Swi%&らしい&=&Designed&for&Safety

Page 20: APIKit

まとめSwi$%を使って安全なコードを書こう