More Related Content
Similar to Himotoki: A type-safe JSON decoding library #関モバ (20)
Himotoki: A type-safe JSON decoding library #関モバ
- 9. 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との相性が悪い
- 15. Himotoki
• プロトコルベースのAPI
• 継承の必要なし
• class%も%struct%も使える。
• let%なプロパティのモデルも安全に扱える。
• 必要なJSONの要素が%nil%であればその時点でデコードを失敗させられる。
• 型推論による簡潔なモデル定義
• Argoのようなカリー化した%create()%メソッドは不要。
- 17. サンプルコード
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)
}
}
- 18. 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"
}
}
- 19. サンプルコード
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)
}