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
Unbox
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
misyobun
March 01, 2016
Programming
1.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Unbox
shibuya.swift #3
misyobun
March 01, 2016
More Decks by misyobun
See All by misyobun
大容量データのダウンロード戦略
misyobun
3
13k
トラウマ
misyobun
0
1.1k
GeoPlayerを使ってアプリをデバッグする
misyobun
0
680
Joda-timeをAndroidで使う話
misyobun
4
990
aarの配備をちょっとだけ楽する話
misyobun
1
290
アノテーションでちょっとだけ楽する話
misyobun
1
530
Other Decks in Programming
See All in Programming
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
120
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
250
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
120
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.3k
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
570
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
6.9k
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
120
Oxlintのカスタムルールの現況
syumai
6
1.1k
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
170
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
160
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
260
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Design in an AI World
tapps
1
250
Amusing Abliteration
ianozsvald
1
210
Navigating Team Friction
lara
192
16k
Are puppies a ranking factor?
jonoalderson
1
3.6k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
210
Raft: Consensus for Rubyists
vanstee
141
7.5k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
Claude Code のすすめ
schroneko
67
230k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Transcript
UNBOX IT’S EASY TO USE SWIFT JSON DECODER SHIBUYA.SWIFT #3
!misyobun
JSON LIBRARIES FOR SWIFT THERE ARE SO MANY !!!!!!!!!!!!! I
WANT TO INTRODUCE ONE OF THEM TO YOU
JSON LIBRARY FOR SWIFT THERE ARE SO MANY !!!!!!!!!!!!! I
WANT TO INTRODUCE ONE OF THEM TO YOU. UNBOX https://github.com/JohnSundell/Unbox
UNBOX { "title": "͕ͯ͢FʹͳΔ", "summary": "16ਐදه", "comment": "4ͭͰ͢" } struct
Book { var title: String var summary: String var comment: String }
UNBOX struct Book : Unboxable{ var title: String var summary:
String var comment: String init(unboxer: Unboxer) { self.title = unboxer.unbox("title") self.summary = unboxer.unbox("summary") self.comment = unboxer.unbox("comment") } } let book: Book? = Unbox(data)
UNBOX struct Book : Unboxable{ var title: String var review:
String var comment: String init(unboxer: Unboxer) { self.title = unboxer.unbox("title") self.review = unboxer.unbox("review") self.comment = unboxer.unbox("comment") } } do { let book: Book? = UnboxOrThrow(data) }catch{ // Error handling }
UNBOX [ "subject": { color = 1e8bc3; name = English;
number = 200;}, "content": ڭ͍͑ͯͩ͘͞ʂ, "grade": { name = "Senior High"; number = 500;}, "created_at": 2016-03-01T14:59:47Z, "id": 12646, "answers_count": 0, "user": { "avatar_url" = "https://s3/ൿີ/hajisirazu/file/4883/01456642777925.jpg?AWSAccessKeyId=?"; id = 303695; name = "tarop"; }, "status": active, "images": ( { height = 891; id = 4883; status = active; "thumb_l_url" = "https://s3/ൿີ/hajisirazu/file/7777/thumb_l_01456642777925.jpg?AWSAccessKeyId=?; "thumb_s_url" = "https://s3/ൿີ/hajisirazu/file/7777/thumb_s_01456642777925.jpg?AWSAccessKeyId=?"; url = "https://s3/ൿີ/hajisirazu/file/4883/01456642777925.jpg?AWSAccessKeyId=?"; width = 557; }) ]
UNBOX struct Grade : Unboxable{ let number: Int let name:
String init(unboxer: Unboxer) { self.number = unboxer.unbox("number") self.name = unboxer.unbox("name") } } struct Subject :Unboxable{ let number: Int let name: String let color :String init(unboxer: Unboxer) { self.number = unboxer.unbox("number") self.color = unboxer.unbox("color") self.name = unboxer.unbox("name") } }
UNBOX struct User: Unboxable { let ID: Int let name:
String let avatarUrl :String init(unboxer: Unboxer) { self.ID = unboxer.unbox("id") self.name = unboxer.unbox("name") self.avatarUrl = unboxer.unbox("avatar_url") } } struct Image: Unboxable { let height: Int let width :Int let id :Int let status :String let thumbLUrl :NSURL let thumbSUrl :NSURL let url :NSURL init(unboxer: Unboxer) { self.height = unboxer.unbox("height") self.width = unboxer.unbox("width") self.id = unboxer.unbox("id") self.status = unboxer.unbox("status") self.thumbLUrl = unboxer.unbox("thumb_l_url") self.thumbSUrl = unboxer.unbox("thumb_s_url") self.url = unboxer.unbox("url") } }
UNBOX struct Question: Unboxable { let ID: Int let content:
String let user: User let subject: Subject? let grade: Grade? let createdAt: String let answersCount: Int let status: String let images: [Image?] init(unboxer: Unboxer) { self.ID = unboxer.unbox("id") self.content = unboxer.unbox("content") self.user = unboxer.unbox("user") self.subject = unboxer.unbox("subject") self.grade = unboxer.unbox("grade") self.createdAt = unboxer.unbox("created_at") self.answersCount = unboxer.unbox("answers_count") self.status = unboxer.unbox("status") self.images = unboxer.unbox("images") } } let question: Question? = Unbox(jsonData)
UNBOX TRANSFORMATIONS Unbox supports transformations that let you treat any
value or object as if it was a raw JSON type. struct UniqueIdentifier: UnboxableByTransform { typealias UnboxRawValueType = String let identifierString: String init?(identifierString: String) { if let UUID = NSUUID(UUIDString: identifierString) { self.identifierString = UUID.UUIDString } else { return nil } } init() { self.identifierString = NSUUID().UUIDString } static func transformUnboxedValue(unboxedValue: String) -> UniqueIdentifier? { return UniqueIdentifier(identifierString: unboxedValue) } static func unboxFallbackValue() -> UniqueIdentifier { return UniqueIdentifier() } }
UNBOX OK. I KNOW WHAT YOU ARE ABOUT TO SAY
TO ME.
UNBOX class Author : RLMObject, Unboxable { var name: String
= "" var age: Int = 0 required convenience init(unboxer: Unboxer) { self.init() self.name = unboxer.unbox("name") self.age = unboxer.unbox("age") } }
UNBOX IT’S SIMILAR TO OBJECTMAPPER !!!!!!!!
UNBOX ENUM SUPPORT enum Android: Int, UnboxableEnum { case IceCreamSandwich
case JellyBean case KitKat case Lollipop case Marshmallow static func unboxFallbackValue() -> Android { return .IceCreamSandwich } }
UNBOX CONTEXTUAL OBJECTS SUPPORT let author: Author? = try UnboxOrThrow(authorJson)
let book: Book? = try UnboxOrThrow(bookJSON, context: author) UNBOX HAS HAD SUPPORT FOR PASSING AN OPTIONAL CONTEXT OBJECT INTO THE UNBOXING PROCESS.
UNBOX struct Book : UnboxableWithContext{ var title: String var body:
String var comment: String var author: Author? var description : String { return "this is description" } init(unboxer: Unboxer,context:Author) { self.title = unboxer.unbox("title") self.body = unboxer.unbox("body") self.comment = unboxer.unbox("comment") self.author = context } } let author:Author? = Unbox(authorJson) let book:Book? = Unbox(bookJson, context:author)
UNBOX USE WHAT YOU LIKE !
UNBOX THANKS ! https://github.com/JohnSundell/Unbox https://github.com/Hearst-DD/ObjectMapper