SlideShare a Scribd company logo
Himotoki
A"type'safe"JSON"decoding"library
@ikesyo
関西モバイルアプリ研究会!#2,!2015(05(20!Wed
#関モバ
@ikesyo
いけしょー/池田翔
京都でフリーランスのiOSエンジニア
(時々Android)しています
現在はフリュー㈱のモバイル開発の
チームにジョイン中。
Swi$もReac)veCocoaも使ってます。
Himotoki: A type-safe JSON decoding library #関モバ
Reac%veCocoaのコミッター(Contributor)やってます
閑話休題
Swi$でJSON(=>(オブジェクトの
マッピングってどうしてますか?
前回
Objec&ve(C時代の定番*=>*Mantle
ObjectMapper
Himotoki: A type-safe JSON decoding library #関モバ
ObjectMapperもいいけど……
• オプショナルな"var"を使うのがいけてない
class User: Mappable {
var username: String?
var age: Int?
var array: [AnyObject]?
var group: Gruop? // 別の`Mappable`な型
required init?(_ map: Map) {
mapping(map)
}
func mapping(map: Map) {
username <- map["username"]
age <- map["age"]
array <- map["array"]
group <- map["group"]
}
}
class Group: Mappable { ... }
• inoutパラメータでRealmとの相性が悪い
もっとタイプセーフなJSONマッパーを
ということで作りました
Himotoki(紐解き)
Himotoki: A type-safe JSON decoding library #関モバ
Himotoki
• h#ps://github.com/ikesyo/Himotoki
• ObjectMapperとは違い、JSONのデコード(デシリアライズ)
のみに特化
• Argo>(h#ps://github.com/thoughtbot/Argo)>と同じ方向性
• Argoよりもより簡潔にモデル定義が行えるように
• 外部依存なし(今のところは)
Himotoki
• プロトコルベースのAPI
• 継承の必要なし
• class%も%struct%も使える。
• let%なプロパティのモデルも安全に扱える。
• 必要なJSONの要素が%nil%であればその時点でデコードを失敗させられる。
• 型推論による簡潔なモデル定義
• Argoのようなカリー化した%create()%メソッドは不要。
Decodable
public protocol Decodable {
typealias DecodedType = Self
static func decode(e: Extractor) -> DecodedType?
}
サンプルコード
struct Group: Decodable {
let name: String
let floor: Int
let optional: [String]?
// MARK: Decodable
static func decode(e: Extractor) -> Group? {
// 関数(クロージャ)としてのイニシャライザ
// `let create: ((name: String, floor: Int, optional: [String]?)) -> Group` と推論される。
let create = { Group($0) }
// リスト全体がオプショナルの引数リストを生成する(22引数まで対応)。
// 途中で非オプショナルな引数に対して `nil` が出てきたら引数リストが `nil` になる。
// その引数リスト全体を `Optional.map()` に渡す。
// この場合 `build(a: String?, b: Int?, c: [String]??) -> (String, Int, [String]?)?` と推論される。
return build(
e <| "name",
e <| "floor",
e <||? "optional"
).map(create)
}
}
Argoだと
struct Group: Decodable {
let name: String
let floor: Int
let optional: [String]?
static func create(name: String)(floor: Int)(optional: [String]?) -> Group {
return Gruop(name: name, floor: floor, optional: optional)
}
// MARK: Decodable
static func decode(j: JSON) -> Decoded<User> {
return Gruop.create
<^> j <| "name"
<*> j <| "floor"
<*> j <||? "optional"
}
}
サンプルコード
func testGroup() {
var JSON: [String: AnyObject] = [ "name": "Himotoki", "floor": 12 ]
let g: Group? = decode(JSON)
XCTAssert(g != nil)
XCTAssert(g?.name == "Himotoki")
XCTAssert(g?.floor == 12)
XCTAssert(g?.optional == nil)
JSON["name"] = nil
let f: Group? = decode(JSON)
XCTAssert(f == nil)
}
Operators
演算子は以下の6種類
// 以下 T: Decodable
<| // T
<|? // T?
<|| // [T]
<||? // [T]?
<|-| // [String: T]
<|-|? // [String: T]?
Himotoki'0.2'is'released'today!
Welcome'your'contribu/ons!!'!

More Related Content

PDF
ObjectMapperでJSONマッピング
PDF
Carthageについて知りたいn個のこと
PDF
iOSでのFramework導入のおさらい #関モバ
PDF
SwiftでAndroidアプリ書けるってよ
PDF
Dynamic frameworks tips
PDF
Xcode and iTC submission topics
PDF
Swift 1.2からSwift 2への移行 #cocoa_kansai
PPTX
iOSでライブラリを提供する際に気をつけたいこと
ObjectMapperでJSONマッピング
Carthageについて知りたいn個のこと
iOSでのFramework導入のおさらい #関モバ
SwiftでAndroidアプリ書けるってよ
Dynamic frameworks tips
Xcode and iTC submission topics
Swift 1.2からSwift 2への移行 #cocoa_kansai
iOSでライブラリを提供する際に気をつけたいこと

What's hot (20)

PDF
Java開発で活かしてほしいGit,CI,そして継続的デリバリー #jjug_ccc #ccc_r13
PDF
Objective-C のアレはどこいったの?(Swift の話し
PDF
NativeBaseをはじめとするUIに関する ライブラリを使ったサンプルを作ってみた
PDF
Cmujp21_node-webkit
PDF
Swiftによる関数型プログラミング超入門
PDF
Swiftでの関数型プログラミングについて考えていること
PDF
Refrection of kawasaki.rb
PDF
Apple watch対応アプリのポイントや基本実装・連携tips
PDF
Swift事情2014夏 ~ Swift入門 beta6対応
PDF
iPhoneアプリを Javaで書くよ?
PDF
Ruby and I at 神奈川Ruby会議01
PDF
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
PDF
デザインにもこだわったUiの事始め3
PDF
Railsの現場に入る前のお話(勉強法)
PDF
Perlを書くときに意識していること
PPTX
無名関数のすすめ
PDF
TDD BootCamp in JJUG CCC - レガシーコード対策編 -
PDF
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
PPTX
JavaScript使いのためのTypeScript実践入門
PDF
Swiftだめ自慢Beta5
Java開発で活かしてほしいGit,CI,そして継続的デリバリー #jjug_ccc #ccc_r13
Objective-C のアレはどこいったの?(Swift の話し
NativeBaseをはじめとするUIに関する ライブラリを使ったサンプルを作ってみた
Cmujp21_node-webkit
Swiftによる関数型プログラミング超入門
Swiftでの関数型プログラミングについて考えていること
Refrection of kawasaki.rb
Apple watch対応アプリのポイントや基本実装・連携tips
Swift事情2014夏 ~ Swift入門 beta6対応
iPhoneアプリを Javaで書くよ?
Ruby and I at 神奈川Ruby会議01
オブジェクト指向プログラマが今関数型言語を学ばないといけない理由
デザインにもこだわったUiの事始め3
Railsの現場に入る前のお話(勉強法)
Perlを書くときに意識していること
無名関数のすすめ
TDD BootCamp in JJUG CCC - レガシーコード対策編 -
JavaFXとRoboVMを使ってiOS上で動くアプリを試してみた
JavaScript使いのためのTypeScript実践入門
Swiftだめ自慢Beta5
Ad

Viewers also liked (20)

PDF
iOSのFileProtection
PDF
SwiftLint
PDF
20150826 RealmとHimotoki
PDF
TIPS of Material Design
PDF
かわいいKotlinでAndroidアプリをつくろう
PDF
iOSのCI as a Service事情
PDF
RxSwift x APIKit
PDF
Auto Layout の小技
PDF
var RAC3 = ReactiveCocoa + Swift
PPTX
Leak canaryで メモリリーク調査
PDF
iOS 6 のAuto Rotation
PDF
CAKeyframeAnimation
PDF
Audio QueueでSin波再生
PDF
var RAC3 = ReactiveCocoa + Swift @ ReactiveCocoa Tokyo #rac_tokyo 10/18
PDF
How to handle bitcode
PDF
1画面から始めるStoryboard
PDF
What's new Swift3
PDF
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
PDF
Apache Drill で JSON 形式の オープンデータを分析してみる - db tech showcase Tokyo 2015 2015/06/11
PDF
2016-10-25 product manager conference 資料
iOSのFileProtection
SwiftLint
20150826 RealmとHimotoki
TIPS of Material Design
かわいいKotlinでAndroidアプリをつくろう
iOSのCI as a Service事情
RxSwift x APIKit
Auto Layout の小技
var RAC3 = ReactiveCocoa + Swift
Leak canaryで メモリリーク調査
iOS 6 のAuto Rotation
CAKeyframeAnimation
Audio QueueでSin波再生
var RAC3 = ReactiveCocoa + Swift @ ReactiveCocoa Tokyo #rac_tokyo 10/18
How to handle bitcode
1画面から始めるStoryboard
What's new Swift3
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
Apache Drill で JSON 形式の オープンデータを分析してみる - db tech showcase Tokyo 2015 2015/06/11
2016-10-25 product manager conference 資料
Ad

Similar to Himotoki: A type-safe JSON decoding library #関モバ (20)

PDF
javascript を Xcode でテスト
PDF
Svgアニメーションを実装してみよう 20150207
PDF
Swiftのクロージャー
PPTX
jQueryで気をつけてほしいこと
PDF
Source kittenについて
PPTX
React + FLUX + Redux + Redux Saga のお話
PDF
Creators'night#3今井
PDF
Swift 2 (& lldb) シンポジウム
PDF
Swift 2 (& lldb) シンポジウム
PDF
Swiftビギナーズ倶楽部 vol.2
PDF
オープンソースで作るスマホ文字認識アプリ
PDF
Obniz and cloud vision api
PDF
Javaと小道具
PDF
Swiftのプロパティオブザーバを使い倒す
PDF
楽しいSwift!クラスと構造体を知る:)
PDF
福井スマートフォンハッカソン Titanium Mobileの紹介
PDF
Swiftのアプリ開発でハマったこと
PDF
Realm meet up #17
PDF
オプショナル型。〜なんとなく付ける ! ? 撲滅〜 改訂版
PPTX
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
javascript を Xcode でテスト
Svgアニメーションを実装してみよう 20150207
Swiftのクロージャー
jQueryで気をつけてほしいこと
Source kittenについて
React + FLUX + Redux + Redux Saga のお話
Creators'night#3今井
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
Swiftビギナーズ倶楽部 vol.2
オープンソースで作るスマホ文字認識アプリ
Obniz and cloud vision api
Javaと小道具
Swiftのプロパティオブザーバを使い倒す
楽しいSwift!クラスと構造体を知る:)
福井スマートフォンハッカソン Titanium Mobileの紹介
Swiftのアプリ開発でハマったこと
Realm meet up #17
オプショナル型。〜なんとなく付ける ! ? 撲滅〜 改訂版
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)

Himotoki: A type-safe JSON decoding library #関モバ