Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
サーバー側の仕様変更にCodableで対応する
Search
Sato Takeshi
February 23, 2018
Programming
3
1.2k
サーバー側の仕様変更にCodableで対応する
ROPPONGI.swift 第1回
https://visits.connpass.com/event/78975/
で発表した内容です。
Sato Takeshi
February 23, 2018
Tweet
Share
More Decks by Sato Takeshi
See All by Sato Takeshi
まさかのバグ!SwiftUIプレビューでハマった国際化対応の落とし穴
satotakeshi
0
350
Swift愛好会 の 思い出
satotakeshi
0
100
Xcode 15, Swift 5.9で変わる開発体験
satotakeshi
3
3k
Meet passkeys
satotakeshi
2
380
What's new in Vision
satotakeshi
0
1.8k
Swift Concurrency入門
satotakeshi
11
5.4k
複数端末のつらさを乗り越えてiOS UITestを実行
satotakeshi
1
430
Xcodegenを個人アプリに導入
satotakeshi
3
830
SwiftUIで作る開閉式メニュー
satotakeshi
2
3.1k
Other Decks in Programming
See All in Programming
Amazon Verified Permissions実践入門 〜Cedar活用とAppSync導入事例/Practical Introduction to Amazon Verified Permissions
fossamagna
2
110
品質ワークショップをやってみた
nealle
0
660
Introduce Hono CLI
yusukebe
6
3.2k
登壇は dynamic! な営みである / speech is dynamic
da1chi
0
420
フロントエンド開発のためのブラウザ組み込みAI入門
masashi
7
3.6k
マイベストのシンプルなデータ基盤の話 - Googleスイートとのつき合い方 / mybest-simple-data-architecture-google-nized
snhryt
0
110
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
420
iOSでSVG画像を扱う
kishikawakatsumi
0
180
CSC509 Lecture 08
javiergs
PRO
0
270
Vue 3.6 時代のリアクティビティ最前線 〜Vapor/alien-signals の実践とパフォーマンス最適化〜
hiranuma
2
320
CSC305 Lecture 10
javiergs
PRO
0
320
20251016_Rails News ~Rails 8.1の足音を聴く~
morimorihoge
3
890
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
431
66k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
It's Worth the Effort
3n
187
28k
How STYLIGHT went responsive
nonsquared
100
5.9k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
2.9k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
jQuery: Nuts, Bolts and Bling
dougneiner
65
7.9k
A designer walks into a library…
pauljervisheath
209
24k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3k
YesSQL, Process and Tooling at Scale
rocio
174
15k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
10
900
Building a Scalable Design System with Sketch
lauravandoore
463
33k
Transcript
αʔόʔଆͷ༷มߋʹ CodableͰରԠ͢Δ ROPPONGI.swift ୈ1ճ 20182݄23 ࠤ౻߶࢜ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 1
Who am I ࠤ౻߶࢜ (@hatakenokakashi) MAMORIOגࣜձࣾͰiOSΤϯδχΞ͠ ͍ͯ·͢ɻ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 2
Swift4͔ΒCodable͕ Ճ͞Ε·ͨ͠ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 3
Codableͱ • σʔλͷγϦΞϥΠζɺσγϦΞϥΠζΛܕ҆શͰѻ͑Δϓ ϩτίϧ • Ҏલ͔Β߹ͬͨNSCodingJSONSerializationɺ PropertyListSerializationͱҟͳΓܕΛͦͷ··ѻ͑Δ = more Swifty
! αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 4
Codableͷ͓͞Β͍ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 5
CodableରԠͷܕΛ࡞Δ struct DeviceRequestData: Codable { var uuid: String? var deviceToken:
String? var modelName: String //JSONͷKeyʹରԠ //ࣗಈΤϯίʔυɺσίʔυʹͤΔͳΒ`CodingKeys`ͱ͍͏໊લʹ͢Δ enum CodingKeys: String, CodingKey { case uuid case deviceToken = "device_token" case modelName = "model_name" } } αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 6
Τϯίʔυ let deviceRequestData = DeviceRequestData(uuid: "AAAA", deviceToken: "aaaaaa", modelName: "iPhoneX")
let jsonData = try JSONEncoder().encode(deviceRequestData) let jsonString = String(data: jsonData, encoding: .utf8)! print(jsonString) αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 7
JSON͕࡞͞ΕΔ { "device_token": "aaaaaa", "model_name": "iPhoneX", "uuid": "AAAA" } αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ
8
αʔόʔνʔϜΑΓ༷ มߋͷ͓Βͤ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 9
deviceͱ͍͏ΩʔΛτοϓʹՃ { "device": { "device_token": "aaaaaa", "model_name": "iPhoneX", "uuid": "AAAA"
} } αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 10
͠·͠ΐ͏ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 11
ରԠํ๏1 ܕΛ৽͘͠࡞Δ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 12
DeviceܕΛՃ struct Device: Codable { var uuid: String? var deviceToken:
String? var modelName: String enum CodingKeys: String, CodingKey { case uuid case deviceToken = "device_token" case modelName = "model_name" } } struct DeviceRequestData: Codable { var device: Device } αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 13
ܕͷϓϩύςΟ ᴹᴹ JSONKey αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 14
Τϯίʔυ let device = Device(uuid: "AAAA", deviceToken: "aaaaaa", modelName: "iPhoneX")
let deviceRequestData = DeviceRequestData(device: device) let jsonData = try JSONEncoder().encode(deviceRequestData) let jsonString = String(data: jsonData, encoding: .utf8)! print(jsonString) αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 15
ରԠํ๏2 ϚχϡΞϧΤϯίʔυ࣮͢Δ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 16
encode(to:)ϝιουΛ࣮͢Δ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 17
αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 18
αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 19
αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 20
αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 21
αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 22
σʔλ͕nilͳΒjsonͷΩ ʔΛ֎ͯ͠΄͍͠ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 23
ରԠํ๏ ϚχϡΞϧΤϯίʔυ & encodeIfPresentΛ͏ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 24
encodeϝιουͰencodeIfPresent ͰΤϯίʔυ func encode(to encoder: Encoder) throws { var container
= encoder.container(keyedBy: RootKeys.self) var nestObject = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .device) try nestObject.encode(uuid, forKey: .uuid) try nestObject.encodeIfPresent(deviceToken, forKey: .deviceToken) try nestObject.encode(modelName, forKey: .modelName) } αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 25
nilͷΛೖΕΔ let deviceRequestData = DeviceRequestData(uuid: nil, deviceToken: nil, modelName: "iPhoneX")
let jsonData = try JSONEncoder().encode(deviceRequestData) let jsonString = String(data: jsonData, encoding: .utf8)! print(jsonString) αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 26
encodeIfPresentnilͳΒΩʔ͝ͱ আ { "device": { "model_name": "iPhoneX", "uuid": null }
} encode͕nullʹͳΔ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 27
طଘͷܕΛCodableʹର Ԡ͢Δ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 28
Codableʹ४ڌ͍ͯ͠ͳ͍ܕΛ࣋ͬͯ ͍Δ struct DeviceRequestData: Codable { var uuid: String? var
deviceToken: String? var modelName: ModelName //Codableʹ४ڌ͍ͯ͠ͳ͍ܕ enum CodingKeys: String, CodingKey { case uuid case deviceToken = "device_token" case modelName = "model_name" } } αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 29
ରԠํ๏ Τϯίʔυ͍ͨ࣌͠ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 30
Codableʹ४ڌͤ͞Δ enum ModelName: String, Codable { case iPhoneX case iPhone8
case iPhone8Plus = "iPhone8 Plus" case iPadPro = "iPad Pro" } αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 31
Τϯίʔυ let deviceRequestData = DeviceRequestData(uuid: "AAAA", deviceToken: "aaaa", modelName: ModelName.iPadPro)
let jsonData = try JSONEncoder().encode(deviceRequestData) let jsonString = String(data: jsonData, encoding: .utf8)! print(jsonString) αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 32
݁Ռ { "device_token": "aaaa", "model_name": "iPad Pro", "uuid": "AAAA" }
αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 33
ରԠํ๏ Τϯίʔυ͠ͳͯ͘Α͍࣌ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 34
ॳظͱCodingKeysʹΩʔΛؚΊͳ ͍ struct DeviceRequestData: Codable { var uuid: String? =
"" var deviceToken: String? = "" var modelName: ModelName = ModelName.iPhoneX enum CodingKeys: String, CodingKey { case uuid case deviceToken = "device_token" } } αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 35
Τϯίʔυ let deviceRequestData = DeviceRequestData(uuid: "AAAA", deviceToken: "aaaa", modelName: ModelName.iPadPro)
let jsonData = try JSONEncoder().encode(deviceRequestData) let jsonString = String(data: jsonData, encoding: .utf8)! print(jsonString) αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 36
݁Ռ { "device_token": "aaaa", "uuid": "AAAA" } αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 37
·ͱΊ • JSONߏ͕มΘͬͨͱ͖ • ܕΛ࡞Δ͔ϚχϡΞϧΤϯίʔυΛ͢Δ • σʔλ͕nilͳΒjsonͷΩʔΛ֎͢ • ϚχϡΞϧΤϯίʔυͰencodeIfPresentΛ͏ •
Codableʹ४ڌ͠ͳ͍ܕΛ͍࣋ͬͯΔ࣌ • Τϯίʔυ͢ΔͳΒ४ڌ͢Δ • Τϯίʔυ͠ͳ͍ͳΒCodingKeysͰྻڍΛ֎͢ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 38
͍͞͝ʹ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 39
ੵۃతʹϝϯόʔืूதʂ https://www.wantedly.com/companies/mamorio • iOSΤϯδχΞ • AndroidΤϯδχΞ • UI/UXσβΠφʔ αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 40
MAMORIOגࣜձࣾtry! SwiftΛεϙϯαʔ υ͍ͯ͠·͢! αʔόʔଆͷ༷มߋʹCodableͰରԠ͢Δ 41