Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
APIクライアントをCodableで置き換えた話
Keisuke Kobayashi
April 19, 2018
Programming
0
1.3k
APIクライアントをCodableで置き換えた話
potatotips #50
Keisuke Kobayashi
April 19, 2018
Tweet
Share
More Decks by Keisuke Kobayashi
See All by Keisuke Kobayashi
今日から始める依存性の注入 / First Time Dependency Injection
kobakei
26
6.5k
iOSアプリの技術的負債をどう返済したか / How to repay the technical debt of iOS app
kobakei
2
800
iOSアプリ内で不正なSSL証明書を検知する / SSL Pinning for iOS apps
kobakei
33
9.1k
Kyashアプリ開発の現場
kobakei
4
2.3k
Review of Google I/O 2017 & Prepare for Google I/O 2018
kobakei
0
270
開発者が知っておきたい通知の歴史
kobakei
10
6.7k
mockito-kotlin
kobakei
1
450
2017年に新規アプリを立ち上げた話
kobakei
2
880
Everything of CI/CD in Kyash Android
kobakei
0
1.4k
Other Decks in Programming
See All in Programming
はてなリモートインターンシップ2022 インフラ 講義資料
hatena
4
2.1k
Excelの助けを借りて楽にシナリオを作ろう
rpa_niiyama
0
270
Amebaブログの会員画面システム刷新の道程
ryotasugawara
1
220
Makuakeの認証基盤とRe-Architectureチーム
bmf_san
0
450
監視せなあかんし、五大紙だけにオオカミってな🐺🐺🐺🐺🐺
sadnessojisan
2
1.4k
レガシーフレームワークからの移行
ug
0
110
Qiita Night PHP 2023
fuwasegu
0
10k
ECテックカンファレンス2023
kspace
1
230
Swift Concurrency in GoodNotes
inamiy
4
1.3k
ペパカレで入社した私が感じた2つのギャップと向き合い方
kosuke_ito
0
160
2023年にクル(かもしれない)通信ミドルウェア技術(仮)
s_hosoai
0
180
TokyoR#103_DataProcessing
kilometer
0
520
Featured
See All Featured
The Cult of Friendly URLs
andyhume
68
5.1k
Why You Should Never Use an ORM
jnunemaker
PRO
49
7.9k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
31
20k
BBQ
matthewcrist
75
8.1k
10 Git Anti Patterns You Should be Aware of
lemiorhan
643
54k
Documentation Writing (for coders)
carmenintech
51
2.9k
Writing Fast Ruby
sferik
613
58k
Principles of Awesome APIs and How to Build Them.
keavy
117
15k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
120
29k
Designing with Data
zakiwarfel
91
4.2k
Making the Leap to Tech Lead
cromwellryan
117
7.7k
Adopting Sorbet at Scale
ufuk
65
7.8k
Transcript
API クライアントをCodable で 置き換えた話 Keisuke Kobayashi / @kobakei potatotips #50
About Me Keisuke Kobayashi Twitter: @kobakei122 GitHub, Qiita: @Kobakei Kyash,
Inc Android Engineer -> iOS Engineer -> Engineering Manager
会社のブログ Kyash iOS アプリの大規模リファクタリングの話 http://blog.kyash.co/entry/2018/03/20/150238 ちょっとだけバズった
Codable Swift 4 ~ JSON のシリアライズとデシリアライズの仕組み
Sample struct Hoge: Codable { let foo: String let bar:
String? } let data: Data = ... let decoder: JSONDecoder = JSONDecoder() do { let hoge: Hoge = try decoder.decode(Hoge.self, from: data) print(newJson) //Success!!! } catch { ... }
実際のAPI をCodable に置き換 えた
CodableAlamo re https://github.com/Otbivnoe/CodableAlamo re responseDecodableObject が追加される
CodableAlamo re response.result.value で変換後のオブジェクト取得 Alamofire.request(url) .responseDecodableObject { (res: DataResponse<Hoge>) in
let hoge = res.result.value print(hoge) }
enum enum Brand: String, Decodable { case visa = "visa"
case mastercard = "mastercard" }
Nested Object そのまま使える struct Author: Decodable { let name: String
} struct Book: Decodable { let author: Author // 別のDecodable な構造体 }
JSON のキーとstruct のキーが 違う 例) default はSwift の予約語だからisDefault にした い
{ "default": true }
JSON のキーとstruct のキーが 違う CodingKey を作る struct Hoge: Decodable {
let isDefault: Bool private enum CodingKeys: String, CodingKey { case isDefault = "default" } }
日付の文字列をDate に変換す る dateDecodingStrategy にフォーマッタをセット let dateFormatter = DateFormatter() dateFormatter.dateFormat
= "yyyy-MM-dd'T'HH:mm:ss.SSSSSSxxx" dateFormatter.locale = Locale(identifier: "en_US_POSIX") // ↑ これがないと12 時間表記モードでパースできない let decoder = JSONDecoder() decoder.dateDecodingStrategy = .formatted(dateFormatter) let newJson: Hoge = try decoder.decode(Hoge.self, from: data)
JSON とstruct の構造が違う 同じキーでも型が違うJSON (辛い) [ { "type": "user", "target":
{ "firstName": "Keisuke", "lastName": "Kobayashi" } }, { "type": "store", "target": { "name": "Amazon" } } ]
JSON とstruct の構造が違う それぞれのstruct を別のフィールドにする public struct Transaction: Decodable {
let type: String let user: User? let store: Store? private enum CodingKeys: String, CodingKey { case type case target // JSON のキー"target" に対応 } ...
JSON とstruct の構造が違う init を自分で実装する(めんどくさい) decode のキーはいずれもtarget を使う ... public
init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys. type = try values.decode(String.self, forKey: .type) if type == "user" { user = try values.decode(User.self, forKey: .target) } else if type == "store" { store = try values.decode(Store.self, forKey: .target) } } }
まとめ Codable いいぞ Alamo re 使ってるならCodableAlamo re いいぞ つらいJSON でもinit
で自分でデコードすればなん とかなるけどつらいぞ
Try! Codable