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
370
Swift愛好会 の 思い出
satotakeshi
0
110
Xcode 15, Swift 5.9で変わる開発体験
satotakeshi
3
3k
Meet passkeys
satotakeshi
2
390
What's new in Vision
satotakeshi
0
2.1k
Swift Concurrency入門
satotakeshi
11
5.4k
複数端末のつらさを乗り越えてiOS UITestを実行
satotakeshi
1
440
Xcodegenを個人アプリに導入
satotakeshi
3
860
SwiftUIで作る開閉式メニュー
satotakeshi
2
3.1k
Other Decks in Programming
See All in Programming
TerraformとStrands AgentsでAmazon Bedrock AgentCoreのSSO認証付きエージェントを量産しよう!
neruneruo
4
2.1k
AI 駆動開発ライフサイクル(AI-DLC):ソフトウェアエンジニアリングの再構築 / AI-DLC Introduction
kanamasa
11
4.6k
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
3.2k
開発に寄りそう自動テストの実現
goyoki
2
1.6k
クラウドに依存しないS3を使った開発術
simesaba80
0
190
GoLab2025 Recap
kuro_kurorrr
0
790
JETLS.jl ─ A New Language Server for Julia
abap34
2
470
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
610
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
210
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
230
まだ間に合う!Claude Code元年をふりかえる
nogu66
5
920
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
680
Featured
See All Featured
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
36
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
400
Music & Morning Musume
bryan
46
7k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
220
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
0
100
A Soul's Torment
seathinner
1
2k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
590
Believing is Seeing
oripsolob
0
18
Discover your Explorer Soul
emna__ayadi
2
1k
BBQ
matthewcrist
89
9.9k
Darren the Foodie - Storyboard
khoart
PRO
0
2k
Building AI with AI
inesmontani
PRO
1
590
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