SlideShare a Scribd company logo
1 of 10
Download to read offline
Objective-C厨がSwiftにハマったでござる
Programming
Yuichi Yoshida
Chief engineer, DENSO IT Laboratory, Inc.
#potatotips
@sonson_twit
© 2014YuichiYoshida, All rights reserved. Redistribution or public display not permitted without written permission from YuichiYoshida.
Swift - Result<T>型で結果を返すのは邪道か,王道か
自己紹介
2tchの中の人
• iOS好きです
• 2tch(2ちゃんねるビューア)
• iOS SDK Hacksなど
• 研究・開発
• コンピュータビジョン
• 機械学習
• 画像検索サービスとか
• 車向けサービスやハードウェアとか
reddift
Swift Reddit API Wrapper
• 1億人以上のアメリカのSNS
• APIあり
• Objective-CのAPI Wrapperはあり
• OAuth2に対応してない
• Swiftじゃない
• よし,いっちょ,勉強がてら作るか!
• MIT License
https://github.com/sonsongithub/reddift
よくあるコード?
func linkList(
paginator:Paginator?,
sortingType:ListingSortType,
subreddit:Subreddit?,
completion:(
links:[Link],
paginator:Paginator?,
error:NSError?
)->Void) -> NSURLSessionDataTask
ダウンロード後のコールバックをブロックで渡す
書き方もありますが
func linkList(paginator:Paginator?, sortingType:ListingSortType, subreddit:Subreddit?, completion:(links:[Link], paginator:Paginator?, error:NSError?)->Void)
-> NSURLSessionDataTask {
var parameter:[String:String] = [:]
if let paginator = paginator {
if paginator.sortingType == sortingType {
parameter = paginator.parameters()
}
}
var path = sortingType.path()
if let subreddit = subreddit {
path = "/r/(subreddit.display_name)(path)"
}
var URLRequest = NSMutableURLRequest.mutableOAuthRequestWithBaseURL(baseURL, path:path, parameter:parameter, method:"GET", token:token)
let task = URLSession.dataTaskWithRequest(URLRequest, completionHandler: { (data:NSData!, response:NSURLResponse!, error:NSError!) -> Void in
self.updateRateLimitWithURLResponse(response)
if error != nil {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
completion(links:[], paginator: nil, error: error)
})
}
else {
if let json:[String:AnyObject] = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.allZeros, error: nil) as?
[String:AnyObject] {
let (links, paginator) = self.parseLinkListJSON(json)
if links.count > 0 && paginator != nil {
paginator?.sortingType = sortingType;
dispatch_async(dispatch_get_main_queue(), { () -> Void in
completion(links:links, paginator:paginator, error:nil)
})
}
else {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
completion(links:links, paginator:paginator, error:NSError.errorWithCode(0, userinfo: ["error":"Can not get any contents
expectedly."]))
})
}
}
else {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
completion(links:[], paginator: nil, error:NSError.errorWithCode(0, userinfo: ["error":"Can not parse response object."]))
})
}
}
})
task.resume()
return task
}
エラーと戻り値がぐちゃぐちゃに
Functional Concepts and Generics
session?.getList(. . . . . . , completion: { (result) in
switch result {
case let .Error(error):
println(error.code)
case let .Value(box):
println(box.value)
// do something
}
})
https://robots.thoughtbot.com/efficient-json-in-swift-with-
functional-concepts-and-generics
基本,ここと岸川さんの受け売り
戻り値をResult<T>にする
public enum Result<A> {
case Success(Box<A>)
case Failure(NSError)
public init(value:A) {
self = .Success(Box(value))
}
public init(error: NSError) {
self = .Failure(error)
}
........
}
public final class Box<A> {
public let value: A
public init(_ value: A) {
self.value = value
}
}
正しい戻り値か,

Errorオブジェクトのどちらかを返す
enumになる
戻り値へのアクセスのイメージ
(a : Result<Hoge>) -> Void {
switch(a) {
case let .Success(x):
println(x.value)
case let .Failuare(x):
println(x.error)
}
}
んで演算子定義と組み合わせると,
let task = URLSession.dataTaskWithRequest(request,
completionHandler: { (data:NSData!, response:NSURLResponse!,
error:NSError!) -> Void in
let responseResult = resultFromOptionalError(Response(data:
data, urlResponse: response), error)
let result = responseResult >>> parseResponse >>> decodeJSON
completion(result)
})
task.resume()
もはや後から読めない綺麗なコードができあがる!!!
まとめ,ではなく議論
• Result<A>で書くと綺麗
• 演算子定義もやるとさらに綺麗
• 他の書き方もある
• flatMap?
• 多くのOSSでみんな車輪の再発明をやってる
• 読みやすいか
• 書きやすいか
• デバッグしやすいか
議論したいです,ハイ

More Related Content

Viewers also liked

Google Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたGoogle Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたShigeki Yamato
 
KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話shinnosuke kugimiya
 
SQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くSQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くTakao Sumitomo
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するTomoki Hasegawa
 
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜Shuichi Tsutsumi
 
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)将之 小野
 
RealmとApp Extensionのガイダンス/Realm meetup vol.6
RealmとApp Extensionのガイダンス/Realm meetup vol.6RealmとApp Extensionのガイダンス/Realm meetup vol.6
RealmとApp Extensionのガイダンス/Realm meetup vol.6Yuta Hoshino
 
App extension for iOS
App extension for iOSApp extension for iOS
App extension for iOStoyship
 
Swiftのこれまでの動向のまとめと 今後のさらなる発展の期待 - iOSDC 2016
Swiftのこれまでの動向のまとめと 今後のさらなる発展の期待 - iOSDC 2016Swiftのこれまでの動向のまとめと 今後のさらなる発展の期待 - iOSDC 2016
Swiftのこれまでの動向のまとめと 今後のさらなる発展の期待 - iOSDC 2016将之 小野
 
iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までiOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までYuki Tanabe
 
iOSアプリのライブラリ依存管理ツールとして Swift Package Managerを使うのは まだしばらく先かなと思った話
iOSアプリのライブラリ依存管理ツールとして Swift Package Managerを使うのは まだしばらく先かなと思った話iOSアプリのライブラリ依存管理ツールとして Swift Package Managerを使うのは まだしばらく先かなと思った話
iOSアプリのライブラリ依存管理ツールとして Swift Package Managerを使うのは まだしばらく先かなと思った話将之 小野
 
アルゴリズム取引のシステムを開発・運用してみて分かったこと
アルゴリズム取引のシステムを開発・運用してみて分かったことアルゴリズム取引のシステムを開発・運用してみて分かったこと
アルゴリズム取引のシステムを開発・運用してみて分かったことSatoshi KOBAYASHI
 

Viewers also liked (12)

Google Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたGoogle Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみた
 
KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話
 
SQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くSQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗く
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化する
 
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
 
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
 
RealmとApp Extensionのガイダンス/Realm meetup vol.6
RealmとApp Extensionのガイダンス/Realm meetup vol.6RealmとApp Extensionのガイダンス/Realm meetup vol.6
RealmとApp Extensionのガイダンス/Realm meetup vol.6
 
App extension for iOS
App extension for iOSApp extension for iOS
App extension for iOS
 
Swiftのこれまでの動向のまとめと 今後のさらなる発展の期待 - iOSDC 2016
Swiftのこれまでの動向のまとめと 今後のさらなる発展の期待 - iOSDC 2016Swiftのこれまでの動向のまとめと 今後のさらなる発展の期待 - iOSDC 2016
Swiftのこれまでの動向のまとめと 今後のさらなる発展の期待 - iOSDC 2016
 
iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までiOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips まで
 
iOSアプリのライブラリ依存管理ツールとして Swift Package Managerを使うのは まだしばらく先かなと思った話
iOSアプリのライブラリ依存管理ツールとして Swift Package Managerを使うのは まだしばらく先かなと思った話iOSアプリのライブラリ依存管理ツールとして Swift Package Managerを使うのは まだしばらく先かなと思った話
iOSアプリのライブラリ依存管理ツールとして Swift Package Managerを使うのは まだしばらく先かなと思った話
 
アルゴリズム取引のシステムを開発・運用してみて分かったこと
アルゴリズム取引のシステムを開発・運用してみて分かったことアルゴリズム取引のシステムを開発・運用してみて分かったこと
アルゴリズム取引のシステムを開発・運用してみて分かったこと
 

Similar to Swift - Result&lt;t>型で結果を返すのは邪道か,王道か

Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムYuichi Yoshida
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignRyuji TAKEHARA
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみようSlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみようShigeo Ueda
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Tomoki Hasegawa
 
Webの仕組みとプログラミング言語
Webの仕組みとプログラミング言語Webの仕組みとプログラミング言語
Webの仕組みとプログラミング言語Yossy Taka
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Yuji Takayama
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittrkenjis
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック庸介 高橋
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼうyouku
 
Movable Type 6の新機能 Data APIの活用法
Movable Type 6の新機能 Data APIの活用法Movable Type 6の新機能 Data APIの活用法
Movable Type 6の新機能 Data APIの活用法Hajime Fujimoto
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
JavaScriptテンプレートエンジンで活かすData API
JavaScriptテンプレートエンジンで活かすData APIJavaScriptテンプレートエンジンで活かすData API
JavaScriptテンプレートエンジンで活かすData APIHajime Fujimoto
 
.NETの自作ツール公開手段
.NETの自作ツール公開手段.NETの自作ツール公開手段
.NETの自作ツール公開手段Pierre3 小林
 
システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方Chihiro Ito
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...Naoya Ito
 

Similar to Swift - Result&lt;t>型で結果を返すのは邪道か,王道か (20)

Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless Design
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみようSlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法
 
Webの仕組みとプログラミング言語
Webの仕組みとプログラミング言語Webの仕組みとプログラミング言語
Webの仕組みとプログラミング言語
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittr
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼう
 
Movable Type 6の新機能 Data APIの活用法
Movable Type 6の新機能 Data APIの活用法Movable Type 6の新機能 Data APIの活用法
Movable Type 6の新機能 Data APIの活用法
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
SwiftGarden.pdf
SwiftGarden.pdfSwiftGarden.pdf
SwiftGarden.pdf
 
JavaScriptテンプレートエンジンで活かすData API
JavaScriptテンプレートエンジンで活かすData APIJavaScriptテンプレートエンジンで活かすData API
JavaScriptテンプレートエンジンで活かすData API
 
.NETの自作ツール公開手段
.NETの自作ツール公開手段.NETの自作ツール公開手段
.NETの自作ツール公開手段
 
システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方
 
APIMeetup 20170329_ichimura
APIMeetup 20170329_ichimuraAPIMeetup 20170329_ichimura
APIMeetup 20170329_ichimura
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 

More from Yuichi Yoshida

Halide, Darkroom - 並列化のためのソフトウェア・研究
Halide, Darkroom - 並列化のためのソフトウェア・研究Halide, Darkroom - 並列化のためのソフトウェア・研究
Halide, Darkroom - 並列化のためのソフトウェア・研究Yuichi Yoshida
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムYuichi Yoshida
 
Machine Learning : The high interest credit card of technical debt
Machine Learning : The high interest credit card of technical debt Machine Learning : The high interest credit card of technical debt
Machine Learning : The high interest credit card of technical debt Yuichi Yoshida
 
キーボードアプリとSketchのススメ
キーボードアプリとSketchのススメキーボードアプリとSketchのススメ
キーボードアプリとSketchのススメYuichi Yoshida
 
Getting started with Handoff
Getting started with HandoffGetting started with Handoff
Getting started with HandoffYuichi Yoshida
 
Getting started with CloudKit
Getting started with CloudKitGetting started with CloudKit
Getting started with CloudKitYuichi Yoshida
 
Handoffは動かない〜これから役立たないバッドノウハウ集
Handoffは動かない〜これから役立たないバッドノウハウ集Handoffは動かない〜これから役立たないバッドノウハウ集
Handoffは動かない〜これから役立たないバッドノウハウ集Yuichi Yoshida
 
UIToolbarの同時タッチを防ぐ
UIToolbarの同時タッチを防ぐUIToolbarの同時タッチを防ぐ
UIToolbarの同時タッチを防ぐYuichi Yoshida
 
UZTextView, UZMultilayeredPopoverControllerの解説
UZTextView, UZMultilayeredPopoverControllerの解説UZTextView, UZMultilayeredPopoverControllerの解説
UZTextView, UZMultilayeredPopoverControllerの解説Yuichi Yoshida
 
64bit化してみた話
64bit化してみた話64bit化してみた話
64bit化してみた話Yuichi Yoshida
 

More from Yuichi Yoshida (12)

Halide, Darkroom - 並列化のためのソフトウェア・研究
Halide, Darkroom - 並列化のためのソフトウェア・研究Halide, Darkroom - 並列化のためのソフトウェア・研究
Halide, Darkroom - 並列化のためのソフトウェア・研究
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
 
Machine Learning : The high interest credit card of technical debt
Machine Learning : The high interest credit card of technical debt Machine Learning : The high interest credit card of technical debt
Machine Learning : The high interest credit card of technical debt
 
キーボードアプリとSketchのススメ
キーボードアプリとSketchのススメキーボードアプリとSketchのススメ
キーボードアプリとSketchのススメ
 
Handoff from Safari
Handoff from SafariHandoff from Safari
Handoff from Safari
 
Getting started with Handoff
Getting started with HandoffGetting started with Handoff
Getting started with Handoff
 
Getting started with CloudKit
Getting started with CloudKitGetting started with CloudKit
Getting started with CloudKit
 
Handoffは動かない〜これから役立たないバッドノウハウ集
Handoffは動かない〜これから役立たないバッドノウハウ集Handoffは動かない〜これから役立たないバッドノウハウ集
Handoffは動かない〜これから役立たないバッドノウハウ集
 
UIToolbarの同時タッチを防ぐ
UIToolbarの同時タッチを防ぐUIToolbarの同時タッチを防ぐ
UIToolbarの同時タッチを防ぐ
 
UZTextView, UZMultilayeredPopoverControllerの解説
UZTextView, UZMultilayeredPopoverControllerの解説UZTextView, UZMultilayeredPopoverControllerの解説
UZTextView, UZMultilayeredPopoverControllerの解説
 
64bit化してみた話
64bit化してみた話64bit化してみた話
64bit化してみた話
 
Gitのすすめ
GitのすすめGitのすすめ
Gitのすすめ
 

Swift - Result&lt;t>型で結果を返すのは邪道か,王道か

  • 1. Objective-C厨がSwiftにハマったでござる Programming Yuichi Yoshida Chief engineer, DENSO IT Laboratory, Inc. #potatotips @sonson_twit © 2014YuichiYoshida, All rights reserved. Redistribution or public display not permitted without written permission from YuichiYoshida. Swift - Result<T>型で結果を返すのは邪道か,王道か
  • 2. 自己紹介 2tchの中の人 • iOS好きです • 2tch(2ちゃんねるビューア) • iOS SDK Hacksなど • 研究・開発 • コンピュータビジョン • 機械学習 • 画像検索サービスとか • 車向けサービスやハードウェアとか
  • 3. reddift Swift Reddit API Wrapper • 1億人以上のアメリカのSNS • APIあり • Objective-CのAPI Wrapperはあり • OAuth2に対応してない • Swiftじゃない • よし,いっちょ,勉強がてら作るか! • MIT License https://github.com/sonsongithub/reddift
  • 5. 書き方もありますが func linkList(paginator:Paginator?, sortingType:ListingSortType, subreddit:Subreddit?, completion:(links:[Link], paginator:Paginator?, error:NSError?)->Void) -> NSURLSessionDataTask { var parameter:[String:String] = [:] if let paginator = paginator { if paginator.sortingType == sortingType { parameter = paginator.parameters() } } var path = sortingType.path() if let subreddit = subreddit { path = "/r/(subreddit.display_name)(path)" } var URLRequest = NSMutableURLRequest.mutableOAuthRequestWithBaseURL(baseURL, path:path, parameter:parameter, method:"GET", token:token) let task = URLSession.dataTaskWithRequest(URLRequest, completionHandler: { (data:NSData!, response:NSURLResponse!, error:NSError!) -> Void in self.updateRateLimitWithURLResponse(response) if error != nil { dispatch_async(dispatch_get_main_queue(), { () -> Void in completion(links:[], paginator: nil, error: error) }) } else { if let json:[String:AnyObject] = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.allZeros, error: nil) as? [String:AnyObject] { let (links, paginator) = self.parseLinkListJSON(json) if links.count > 0 && paginator != nil { paginator?.sortingType = sortingType; dispatch_async(dispatch_get_main_queue(), { () -> Void in completion(links:links, paginator:paginator, error:nil) }) } else { dispatch_async(dispatch_get_main_queue(), { () -> Void in completion(links:links, paginator:paginator, error:NSError.errorWithCode(0, userinfo: ["error":"Can not get any contents expectedly."])) }) } } else { dispatch_async(dispatch_get_main_queue(), { () -> Void in completion(links:[], paginator: nil, error:NSError.errorWithCode(0, userinfo: ["error":"Can not parse response object."])) }) } } }) task.resume() return task } エラーと戻り値がぐちゃぐちゃに
  • 6. Functional Concepts and Generics session?.getList(. . . . . . , completion: { (result) in switch result { case let .Error(error): println(error.code) case let .Value(box): println(box.value) // do something } }) https://robots.thoughtbot.com/efficient-json-in-swift-with- functional-concepts-and-generics 基本,ここと岸川さんの受け売り
  • 7. 戻り値をResult<T>にする public enum Result<A> { case Success(Box<A>) case Failure(NSError) public init(value:A) { self = .Success(Box(value)) } public init(error: NSError) { self = .Failure(error) } ........ } public final class Box<A> { public let value: A public init(_ value: A) { self.value = value } } 正しい戻り値か,
 Errorオブジェクトのどちらかを返す enumになる
  • 8. 戻り値へのアクセスのイメージ (a : Result<Hoge>) -> Void { switch(a) { case let .Success(x): println(x.value) case let .Failuare(x): println(x.error) } }
  • 9. んで演算子定義と組み合わせると, let task = URLSession.dataTaskWithRequest(request, completionHandler: { (data:NSData!, response:NSURLResponse!, error:NSError!) -> Void in let responseResult = resultFromOptionalError(Response(data: data, urlResponse: response), error) let result = responseResult >>> parseResponse >>> decodeJSON completion(result) }) task.resume() もはや後から読めない綺麗なコードができあがる!!!
  • 10. まとめ,ではなく議論 • Result<A>で書くと綺麗 • 演算子定義もやるとさらに綺麗 • 他の書き方もある • flatMap? • 多くのOSSでみんな車輪の再発明をやってる • 読みやすいか • 書きやすいか • デバッグしやすいか 議論したいです,ハイ