APIKit
-
Upload
kosuke-usami -
Category
Software
-
view
18 -
download
0
Transcript of APIKit
Swi$%らしい%API%クライアント!"APIKit"を使う"!宇佐見!公輔!@usamik26
宇佐見!公輔!@usamik26• フェンリル株式会社"iOS"アプリプログラマ
• WWDC"2015"参加
• Objec1ve3C"好き
• Swi5"最近好きになった
• Haskell"勉強中
APIKit• Swi%&で&Web&API&クライアント実装をするためのライブラリ
• h.ps://github.com/ishkawa/APIKit
• 3&月の&potato>ps&でご本人による紹介
• その後、仕様変更&バージョンアップ
• 実案件で採用しました
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 ...
API$を実装する側のコード$(1)
class HogeApi: API { override class var baseURL: NSURL { return NSURL(string: "https://hogehoge/api")! } class Endpoint { // この中に各エンドポイントのクラスを実装します // 今回は別ファイルに分けて extension で実装しました }}
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) } ...}
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 } }}
APIKit'の利点
従来のパターン• API%の%comple,on%handler%に、response%と%error%が両方ある
• response%:%成功時のレスポンス
• error%:%失敗時のエラー
従来パターンの問題点
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 ...
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"型
Designed(for(Safety
Designed(for(Safety• Swi%&の特徴のひとつ
• C&言語が「プログラマを信用する」思想であるのと対照的
• 例えば&Op*onal&はこの特徴を実現するためのキー機能のひとつ
• Op*onal&型を&unwrap&しないと普通の型として扱えない
• null&参照がなくなって安全
APIKit'の利点• レスポンスが明確で不明な状態がない
• Swi%&らしい&=&Designed&for&Safety
まとめSwi$%を使って安全なコードを書こう