SlideShare a Scribd company logo
1 of 16
Download to read offline
WebAPIを利用する際の
Optional Bindingやクロー
ジャを駆使したSwiftらしい
コードの書き方
㍿キュリオシティソフトウェア 今城善矩
yimajo
第2回Swift勉強会 - LT会@wantedly
写真はスズキ株式会社Webページから
前回の勉強会後
!
Optional、クロージャ、JSONのパース部分が
よく分からんという話があったので
QiitaのAPIを使って通信をする例で
よりSwiftらしい実践的なコードの書き方を
説明しようと思います
説明のためのコードの全体像について
APIClientTableViewController
jsonEntityクラス
QiitaAPI
[
{title: titleA ,
gist_url:null,
},
{title: titleB ,
gist_url:null,
}
]
class QiitaItemEntity {
let title : String
let gistUrlString : String?
!
init(title : String) {
self.title = title
}
}
色々省略してるけど
配列と辞書になってる
実際のコードで説明
APIリクエストメソッドのインターフェース
引数1つ目tagName:は必須でQiitaの記事のタグを指定
引数2つ目success:はクロージャで成功時の処理
引数3つ目failure:は失敗時の処理でエラーを含む
class QiitaAPIClient {
!
class func items(
tagName:String,
success:((QiitaItemEntity[]) -> Void)?,
failure:((NSError?) -> Void)?)
!
}
メソッドの利用例
ViewControllerのメンバ変数としてQiitaItemEntityの配列
を持ち成功時にそのデータにassignしてtableViewをリ
ロードする
(今回の例では説明の簡素化のため、クラスメソッドにし通信が終わり次第APIClientが破棄されるた
めselfを弱参照にしていない)
QiitaAPIClient.items("swift",
success:{(items:QiitaItemEntity[]) in
//成功時のクロージャー
self.qiitaItems = items
self.tableView.reloadData()
}, failure:nil)
APIリクエストを行うメソッドの
実装例
長くなるので手順を分割して
説明
1. NSURLRequestを組み立てる
2. NSURLConnectionで非同期通信の用意
(AFNetworking使うとその補足がメンドイので
NSURLConnectionを使った)
3. 通信後の非同期処理用クロージャでJSONパー
ス時の処理(Swiftらしいコードになる)
1. NSURLRequestを組み立てる
//クラス変数はないがプロパティはあるのでgetterでStringを返す
class var baseUrlString: String {
return "https://qiita.com/api/v1"
}
class func itemsURL(tagName:String) -> NSURL {
//Stringはプレースホルダに入れて組み立てられる
return NSURL(string:
"(self.baseUrlString)/tags/(tagName)/items")
}
let request = NSURLRequest(URL: itemsURL(tagName))
2. NSURLConnectionで非同期通信
NSURLConnection.sendAsynchronousRequest(
request, //さっき用意したNSURLRequest
queue: NSOperationQueue.mainQueue(),
completionHandler: {(response: NSURLResponse!,
data: NSData!,
error: NSError!) in
// あらかじめエラー処理
if error {failure?(error); return}
// nilのものをJSONパースしようとすると例外起こすので
// 処理をやめる(とりあえずfailure呼び出している)
if !data {failure?(nil); return}
!
// (snip) 次にdataからJSONをパースしクロージャ呼出の説明
}
)
3. 通信後の非同期処理用クロージャ
// (1)仕様上JSONがNSDictionary配列なのでキャストしつつOptional Binding
if let objects = NSJSONSerialization.JSONObjectWithData(data,
options:NSJSONReadingOptions.AllowFragments,
error:&jsonError) as? NSDictionary[] {
!
var items = QiitaItemEntity[]()
//(2)Arrayの全ての要素がNSDictionaryだからfor inできる
for dictionary : NSDictionary in objects {
//(3)最後もBindingしてnilじゃない事を確認してオブジェクト作る
if let title = dictionary["title"] as? String {
let qiita = QiitaItemEntity(title: title)
qiita.gistUrlString = dictionary["gist_url"] as? String
//(5)配列の+=はapendにオーバーロードされる
items += qiita
}
}
}
success(items)
!
} else if jsonError {
failure(jsonError) //想定外1(サーバがなぜかJSONを返していない)
} else {
//想定外2(レスポンスはJSONだが仕様通りのJSONでない)
}
まとめ
Swiftの特徴から開発時に気
をつけること
• コンパイラは変数がnilかどうかをコーディング時に気にさせてくる
• 想定外のことが起こりそうな部分を最小限に留めたい思想を感じる
• Foundation Frameworkにあるメソッドにはnilを引数に渡せるのに渡
すと例外になるものがあってまだ地雷っぽい(nilを渡せないように明示
してくれればいいのに…)
• コンテナが型を明示するようになった
• 何が入ってるかわからない時はOptional Binding
• blocks的なことがクロージャになった
• クロージャもOptionalにできる
今回のソースコードはGitHubに公開しておきます
https://github.com/yimajo/QiitaAPISwiftDemo
http://qiita.com/yimajo/items/32a5209bd73580d283a1
■iOSアプリ開発のためにSwiftでクロージャを実用的に使う方法
■Swiftでは配列の型が確定しないとfor inは扱えない(気がする)
http://qiita.com/yimajo/items/afaac26a4ab0bc0bb320
■Swiftでリソースにあるjsonファイルを読み込む
http://qiita.com/yimajo/items/ca11f9a5fcf623294d26
参考
■SwiftでWebAPIアプリを作った時の要点
http://qiita.com/himara2/items/165393baac0bd1705bfe

More Related Content

Viewers also liked

Swiftで多層型で戻り値を返すことの是非と雑談
Swiftで多層型で戻り値を返すことの是非と雑談Swiftで多層型で戻り値を返すことの是非と雑談
Swiftで多層型で戻り値を返すことの是非と雑談Yuichi Yoshida
 
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜niwatako
 
iOS の通信における認証の種類とその取り扱い
iOS の通信における認証の種類とその取り扱いiOS の通信における認証の種類とその取り扱い
iOS の通信における認証の種類とその取り扱いniwatako
 
Advanced realm in swift
Advanced realm in swiftAdvanced realm in swift
Advanced realm in swiftYusuke Kita
 
FINAL FANTASY Record Keeper の作り方
FINAL FANTASY Record Keeper の作り方FINAL FANTASY Record Keeper の作り方
FINAL FANTASY Record Keeper の作り方dena_study
 

Viewers also liked (6)

Swiftで多層型で戻り値を返すことの是非と雑談
Swiftで多層型で戻り値を返すことの是非と雑談Swiftで多層型で戻り値を返すことの是非と雑談
Swiftで多層型で戻り値を返すことの是非と雑談
 
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜
 
iOS の通信における認証の種類とその取り扱い
iOS の通信における認証の種類とその取り扱いiOS の通信における認証の種類とその取り扱い
iOS の通信における認証の種類とその取り扱い
 
Advanced realm in swift
Advanced realm in swiftAdvanced realm in swift
Advanced realm in swift
 
OpenCV 3.0 on iOS
OpenCV 3.0 on iOSOpenCV 3.0 on iOS
OpenCV 3.0 on iOS
 
FINAL FANTASY Record Keeper の作り方
FINAL FANTASY Record Keeper の作り方FINAL FANTASY Record Keeper の作り方
FINAL FANTASY Record Keeper の作り方
 

Similar to WebApiを利用する際のOptional Bindingやクロージャを駆使したSwiftらしいコードの書き方

JSON Schema で Web API のスキマを埋めよう
JSON Schema で Web API のスキマを埋めようJSON Schema で Web API のスキマを埋めよう
JSON Schema で Web API のスキマを埋めようVOYAGE GROUP
 
Tokyowebmining5 yokkuns
Tokyowebmining5 yokkunsTokyowebmining5 yokkuns
Tokyowebmining5 yokkunsYohei Sato
 
AWSで開発するサーバレスAPIバックエンド
AWSで開発するサーバレスAPIバックエンドAWSで開発するサーバレスAPIバックエンド
AWSで開発するサーバレスAPIバックエンド暁 三宅
 
20160624 JAWS-UG名古屋 第12回 API Gateway 事始め
20160624 JAWS-UG名古屋 第12回 API Gateway 事始め20160624 JAWS-UG名古屋 第12回 API Gateway 事始め
20160624 JAWS-UG名古屋 第12回 API Gateway 事始めToshiaki Aoike
 
MTDDC 2013 LT | Hello, my little giant
MTDDC 2013 LT | Hello, my little giantMTDDC 2013 LT | Hello, my little giant
MTDDC 2013 LT | Hello, my little gianttaiju higashi
 
Laravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するならLaravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するならShohei Okada
 
Kubernete Gateway APIとAmazon VPC Lattice.pptx
Kubernete Gateway APIとAmazon VPC Lattice.pptxKubernete Gateway APIとAmazon VPC Lattice.pptx
Kubernete Gateway APIとAmazon VPC Lattice.pptxssuser34f6a5
 

Similar to WebApiを利用する際のOptional Bindingやクロージャを駆使したSwiftらしいコードの書き方 (8)

JSON Schema で Web API のスキマを埋めよう
JSON Schema で Web API のスキマを埋めようJSON Schema で Web API のスキマを埋めよう
JSON Schema で Web API のスキマを埋めよう
 
Tokyowebmining5 yokkuns
Tokyowebmining5 yokkunsTokyowebmining5 yokkuns
Tokyowebmining5 yokkuns
 
AWSで開発するサーバレスAPIバックエンド
AWSで開発するサーバレスAPIバックエンドAWSで開発するサーバレスAPIバックエンド
AWSで開発するサーバレスAPIバックエンド
 
20160624 JAWS-UG名古屋 第12回 API Gateway 事始め
20160624 JAWS-UG名古屋 第12回 API Gateway 事始め20160624 JAWS-UG名古屋 第12回 API Gateway 事始め
20160624 JAWS-UG名古屋 第12回 API Gateway 事始め
 
MTDDC 2013 LT | Hello, my little giant
MTDDC 2013 LT | Hello, my little giantMTDDC 2013 LT | Hello, my little giant
MTDDC 2013 LT | Hello, my little giant
 
APIKit
APIKitAPIKit
APIKit
 
Laravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するならLaravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するなら
 
Kubernete Gateway APIとAmazon VPC Lattice.pptx
Kubernete Gateway APIとAmazon VPC Lattice.pptxKubernete Gateway APIとAmazon VPC Lattice.pptx
Kubernete Gateway APIとAmazon VPC Lattice.pptx
 

More from 今城 善矩

HealthKitで日別のデータを一度に取得する
HealthKitで日別のデータを一度に取得するHealthKitで日別のデータを一度に取得する
HealthKitで日別のデータを一度に取得する今城 善矩
 
とにかく明るいCore Spotlight
とにかく明るいCore Spotlightとにかく明るいCore Spotlight
とにかく明るいCore Spotlight今城 善矩
 
SansanのEightアプリでRealmを導入した件
SansanのEightアプリでRealmを導入した件SansanのEightアプリでRealmを導入した件
SansanのEightアプリでRealmを導入した件今城 善矩
 
BaseViewControllerは作りたくない
BaseViewControllerは作りたくないBaseViewControllerは作りたくない
BaseViewControllerは作りたくない今城 善矩
 
まだSwiftで消耗してるの?
まだSwiftで消耗してるの?まだSwiftで消耗してるの?
まだSwiftで消耗してるの?今城 善矩
 
小学生でも分かった気になるiOS8のSize Class
小学生でも分かった気になるiOS8のSize Class小学生でも分かった気になるiOS8のSize Class
小学生でも分かった気になるiOS8のSize Class今城 善矩
 
iOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtipsiOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtips今城 善矩
 
Swiftだめ自慢Beta5
Swiftだめ自慢Beta5Swiftだめ自慢Beta5
Swiftだめ自慢Beta5今城 善矩
 
やはりお前らのCore Dataの使い方も間違っている
やはりお前らのCore Dataの使い方も間違っているやはりお前らのCore Dataの使い方も間違っている
やはりお前らのCore Dataの使い方も間違っている今城 善矩
 
OHHTTPStubsを使ったiOSアプリ開発
OHHTTPStubsを使ったiOSアプリ開発OHHTTPStubsを使ったiOSアプリ開発
OHHTTPStubsを使ったiOSアプリ開発今城 善矩
 
ジョブズも成仏するTips考えたったwww
ジョブズも成仏するTips考えたったwwwジョブズも成仏するTips考えたったwww
ジョブズも成仏するTips考えたったwww今城 善矩
 
やはりお前らのiOS7対応は間違っている
やはりお前らのiOS7対応は間違っているやはりお前らのiOS7対応は間違っている
やはりお前らのiOS7対応は間違っている今城 善矩
 

More from 今城 善矩 (13)

HealthKitで日別のデータを一度に取得する
HealthKitで日別のデータを一度に取得するHealthKitで日別のデータを一度に取得する
HealthKitで日別のデータを一度に取得する
 
Stargazer Meetup1
Stargazer Meetup1Stargazer Meetup1
Stargazer Meetup1
 
とにかく明るいCore Spotlight
とにかく明るいCore Spotlightとにかく明るいCore Spotlight
とにかく明るいCore Spotlight
 
SansanのEightアプリでRealmを導入した件
SansanのEightアプリでRealmを導入した件SansanのEightアプリでRealmを導入した件
SansanのEightアプリでRealmを導入した件
 
BaseViewControllerは作りたくない
BaseViewControllerは作りたくないBaseViewControllerは作りたくない
BaseViewControllerは作りたくない
 
まだSwiftで消耗してるの?
まだSwiftで消耗してるの?まだSwiftで消耗してるの?
まだSwiftで消耗してるの?
 
小学生でも分かった気になるiOS8のSize Class
小学生でも分かった気になるiOS8のSize Class小学生でも分かった気になるiOS8のSize Class
小学生でも分かった気になるiOS8のSize Class
 
iOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtipsiOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtips
 
Swiftだめ自慢Beta5
Swiftだめ自慢Beta5Swiftだめ自慢Beta5
Swiftだめ自慢Beta5
 
やはりお前らのCore Dataの使い方も間違っている
やはりお前らのCore Dataの使い方も間違っているやはりお前らのCore Dataの使い方も間違っている
やはりお前らのCore Dataの使い方も間違っている
 
OHHTTPStubsを使ったiOSアプリ開発
OHHTTPStubsを使ったiOSアプリ開発OHHTTPStubsを使ったiOSアプリ開発
OHHTTPStubsを使ったiOSアプリ開発
 
ジョブズも成仏するTips考えたったwww
ジョブズも成仏するTips考えたったwwwジョブズも成仏するTips考えたったwww
ジョブズも成仏するTips考えたったwww
 
やはりお前らのiOS7対応は間違っている
やはりお前らのiOS7対応は間違っているやはりお前らのiOS7対応は間違っている
やはりお前らのiOS7対応は間違っている
 

WebApiを利用する際のOptional Bindingやクロージャを駆使したSwiftらしいコードの書き方