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
1.2k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
サーバー側の仕様変更にCodableで対応する
ROPPONGI.swift 第1回
https://visits.connpass.com/event/78975/
で発表した内容です。
Sato Takeshi
February 23, 2018
More Decks by Sato Takeshi
See All by Sato Takeshi
まさかのバグ!SwiftUIプレビューでハマった国際化対応の落とし穴
satotakeshi
0
430
Swift愛好会 の 思い出
satotakeshi
0
140
Xcode 15, Swift 5.9で変わる開発体験
satotakeshi
3
3.1k
Meet passkeys
satotakeshi
2
430
What's new in Vision
satotakeshi
0
2.4k
Swift Concurrency入門
satotakeshi
11
5.6k
複数端末のつらさを乗り越えてiOS UITestを実行
satotakeshi
1
480
Xcodegenを個人アプリに導入
satotakeshi
3
930
SwiftUIで作る開閉式メニュー
satotakeshi
2
3.3k
Other Decks in Programming
See All in Programming
OSINT for SRE: 学術論文とポストモーテムから探る システム障害の共通パターン / SRE NEXT 2026
tomoyk
1
3.5k
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
610
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.8k
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
310
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
220
symfony/aiとlaravel/boost
77web
0
120
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
100
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
8.9k
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
480
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
200
Featured
See All Featured
First, design no harm
axbom
PRO
2
1.2k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
890
Why Our Code Smells
bkeepers
PRO
340
58k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Faster Mobile Websites
deanohume
310
32k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
420
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
490
Skip the Path - Find Your Career Trail
mkilby
1
170
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
How STYLIGHT went responsive
nonsquared
100
6.2k
Designing for Performance
lara
611
70k
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