์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ํ๋ก๊ทธ๋๋จธ์ค
- UIRefreshController
- CRUD
- Encodable
- DispatchQueue
- nodejs
- Core Data
- ์ฑ๋ง๋ค๊ธฐ
- ios
- mongoose
- Codable
- Cloud Firestore
- components
- ์ง๋ฒ๋ณํ
- Reduce
- RxSwift
- map
- ์๊ณ ๋ฆฌ์ฆ
- SWiFT
- Firestore CRUD
- MongoDB
- Mac
- Firestore
- Figma
- ์ฑ๋์์ธ
- Filter
- String.Index
- Decodable
- AVAudioPlayer
- ExpressJS
- Today
- Total
Focus On Develop ๐ค๐ค
[Swift] CodingKey ๋ณธ๋ฌธ
๋ค๋ค Codable์ ๋ง์ด ์ฌ์ฉํ์์ฃ ~~~?? Codable์ ๋ํ ์ค๋ช ์ ๐ ์ฌ๊ธฐ์
๊ฐ๋จํ ์์ฝํ๋ฉด ๋คํธ์ ํต์ ๋ฑ์ ํตํด ์ธ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฐ์ฅ ๋ณดํธ์ ์ธ ๋ฐ์ดํฐ ํฌ๋งท์ด json์ด์ฃ !!
์ด jsonํ์ผ์ ์ฑ์์ ์ฌ์ฉ๊ฐ๋ฅํ๋๋ก Object๋ก ๋ง๋๋ ๊ณผ์ ์ Decoding, ์ฑ์ Object๋ฅผ jsonํ์ผ๋ก ๋ง๋๋ ๊ณผ์ ์ Encoding ์ด๋ผ๊ณ ํ์์ฃ ! ๊ทธ๋ฆฌ๊ณ Encoding, Decoding ํ๋กํ ์ฝ์ ๋ ๋ค ํฌํจํ๋๊ฒ Codable ํ๋กํ ์ฝ์ด์์ต๋๋ค ๐ค
Codable ํ๋กํ ์ฝ์ ํตํด Encoding, Decoding์ ์๊ณ ์๋ค๊ณ ์๊ฐํ๊ณ ํ ํ ์ง๋๊ฐ๋๋ค!! ์ฌ๊ธฐ ๊ผญ ๋ณด๊ณ ์ค์ธ์๐
Codable์ Swift์์ ๊ต์ฅํ ๊ฐ๋ ฅํ! ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ๋ ๊ฒ์ ๋ง์ต๋๋ค๋ง,,,,
๊ทธ๋ฅ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ธ๋ถ์ ๋ฐ์ดํฐ key๊ฐ๊ณผ ์ฐ๋ฆฌ ์ฑ์์ ์ฌ์ฉํ๋ Object์ property ์ด๋ฆ์ด ๊ฐ์์ผ ํ์ฃ !
์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ ์ฑ์์๋ ์นด๋ฉ์ผ์ด์ค๋ฅผ ์ฌ์ฉํด์, ์ด๋ ๊ฒ ํ๋กํผํฐ๋ช ์ ์ ํด์คฌ๋ค๊ณ ์นฉ์๋ค.
struct Car {
var model: String
var maxSpeed: Int
var createAt: Date
}
๊ทผ๋ฐ.. ์๋ฒ์์ ๋ด๋ ค์ค๋ json์ ํค๊ฐ์ด max_speed ์ฒ๋ผ ์ค๋ค์ดํฌ ์ผ์ด์ค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, highSpeed ์ฒ๋ผ ๋ค๋ฅธ Key๋ช ์ ๊ฐ์ง๋ค๋ฉด ์๋ง Codable๋ง ์ฌ์ฉํด์๋ Parsing์ด ์๋ ๊ฑฐ์์ ๐ญ
์ด๋ ๊ฒ json๋ฐ์ดํฐ์ Key๊ฐ๊ณผ, Object์ ํ๋กํผํฐ๋ช ์ด ๋ค๋ฅผ๋! ํ์ํ๊ฒ CodingKey ํ์ ์ด์์.
CodingKey ์ญ์ ํ๋กํ ์ฝ์ด๊ณ , ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ์ ์ํ ํค๋ก ์ฌ์ฉํ ์ ์๋ ํ์ ์ด๋ผ๊ณ ํ๋ค์ ๐
*์ฝ๊ฐ* ๋ณต์กํ ์์๋ฅผ ๊ฐ์ง๊ณ ์ค๋ช ํด๋ณผ๊ฒ์! ์ง์คํด์ฃผ์ธ์ ๐
์ฐ๋ฆฌ๋ ์๋ฒ์์ ์ด๋ฐ json๋ฐ์ดํฐ๋ฅผ ๋ด๋ ค๋ฐ์๊ณ , ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๋ฐ์ดํฐ๋ ์์์ ์ด๋ก์ ๋ฐ์ค์ ์๋ ๋ ์๋ค์ด์์!
๊ทผ๋ฐ ์ฐ๋ฆฌ๋ Video Object์ ํ๋กํผํฐ๋ช ์ ์ด๋ ๊ฒ ์ ์ํด์คฌ์ด์.
struct Video: Decodable {
var videoId: String
var title: String
var description: String
var thumbnail: String
var published: Date
}
์.. ๊ทธ๋ฌ๋ฉด ํค๊ฐ์ด ๋ฌ๋ผ์ ์ ์์ ์ผ๋ก Codable์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ์ํฉ์ด ๋์ฃ ~~?
์ง๊ธ๋ถํฐ CodingKey๋ฅผ ํตํด ํด๊ฒฐํด๋ณผ๊ฒ์!!
enum CodingKeys: String, CodingKey {
case published = "publishedAt"
case title
case description
case thumbnail = "url"
case videoId
}
์ง ~~ ์ด๋ ๊ฒ CodingKey ํ๋กํ ์ฝ์ ์ฑํํ๋ CodingKeys๋ผ๋ enumํ์ ์ ํตํด ์ค์ ๋ก json๋ฐ์ดํฐ์ ์๋ key์ด๋ฆ์ ๋ช ์์ ์ผ๋ก ์ง์ ํด์คฌ์ด์! ์ฌ๊ธฐ์ String์ ์ฑํํ๋ ์ด์ ๋, json์ ๋ชจ๋ key๋ช ์ด String์ด๊ธฐ ๋๋ฌธ์ด์์~!!
์ด์ ๋ "์ด ํค๊ฐ์ ์ด ํ๋กํผํฐ์ ์ฌ์ฉํด๋ผ!"๋ผ๊ณ ํด์ค๊ฑฐ์ฃ ใ ใ
๊ทธ๋ฐ๋ฐ.... ์ด๋ ๊ฒ CodingKey๋ก ๋ฐ๋ก๋ฐ๋ก ์ง์ ํด์ฃผ๋๋ฐ๋ ํ๊ณ์ ์ด ์์ด์,
๋ฐ๋ก.. ์ ๋ ๊ฒ ๋จ์ํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด์ json์์ { } ๋ก ๊ฐ์ธ์ ธ ์๋ depth๊ฐ ๊ฐ์์ผ ํ๋ค๋๊ฑฐ์์!
์ json๋ฐ์ดํฐ๋ฅผ ์๋ก๋ค๋ฉด, items (1depth), snippet (2depth), title (3depth), url (5depth) ์ด๋ ๊ฒ ๋ชจ๋ depth๊ฐ ๋ค๋ฅด์ฃ ~?
์ด๋ฐ ๊ฒฝ์ฐ์๋ CodingKey๋ง ๋ฑ! ์ง์ ํด์คฌ๋ค๊ณ ๋ฐ๋ก ์ฐพ์ ์๊ฐ ์์ด์.๐ญ
(๋ง์ฝ ์ด ๊ฒฝ์ฐ์๋ depth๊ฐ ๋ชจ๋ ๊ฐ์๋ค๋ฉด ์๋ ๊ณผ์ ์ ํ์์์ด ๋ฐ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ ๐)
๊ทธ๋์ ์ง๊ธ๋ถํฐ ์ด๊ธฐํ์ฝ๋์์ ๋ด๊ฐ ์ํ๋ ์ ํค๊ฐ์ด json์์ ์ด๋ ์์น(depth)์ ์๋์ง๋ฅผ ๊ฐ์ด ๋ช ์์ ์ผ๋ก ์๋ ค์ค๊ฑฐ์์!
์ฐ์ , ์ฐ๋ฆฌ๊ฐ ์ฐพ๋ ํค๊ฐ์ด ์๋ ๊ณณ๊น์ง ๊ฐ๊ธฐ ์ํด ๊ฑฐ์ณ์ผํ๋ ์์ depth์ ํค๊ฐ๋ค์ ๊ฐ์ด ์ ์ํด์ฃผ์ธ์.
enum CodingKeys: String, CodingKey {
case snippet
case thumbnails
case high
case resourceId
case published = "publishedAt"
case title
case description
case thumbnail = "url"
case videoId
}
๋ณธ๊ฒฉ ์ด๊ธฐํ ์ค๋ช ์ ์์, json์์ "container" ๋ผ๋ ๊ฐ๋ ์ json์์ { }๋ก ๋ฌถ์ธ ํ๋์ ๋จ์ ๋ผ๊ณ ์๊ฐํด์ฃผ์ธ์!
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
}
decoder๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ๋ init ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ค๊ฑฐ์์.
๋จผ์ container๋ฅผ ์ ์ํด์คฌ์ฃ !? ์ด๊ฑด ์ต์์ { } ์ ํฌํจ๋ container๋ฅผ ์ ์ํด์ค๊ฑฐ์์ -> ์ฌ๊ธฐ์ items { }
๋ค์์ snippet์ ๋ํ container๋ฅผ ์ ์ํด์ค๋ณผ๊ฒ์.
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let snippetContainer = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .snippet)
}
์ด ๋ง์ ๋จผ์ ์ ์ํด์คฌ๋ container { } ์ ๋ฐ๋ก "ํ์์ nesting ๋์ด์๋ { } ์ปจํ ์ด๋๋ฅผ ๊ฐ์ ธ์์ ์ฐ๋ฆฌ๊ฐ CodingKeys์ ์ ์ํ snippet์ ์ด ์ปจํ ์ด๋๋ฅผ ํ ๋นํด์ค๋ผ!" ๋ผ๋ ์๋ฏธ๊ฐ ๋๋๊ฑฐ์์.
์์ง์ ์กฐ~๊ธ ๋๋์ ์ค์ง๋ง ํท๊ฐ๋ฆฌ์ฃ ~~?
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let snippetContainer = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .snippet)
self.title = try snippetContainer.decode(String.self, forKey: .title)
}
title ์ด๋ผ๋ ํค๊ฐ์ snippet์ด๋ผ๋ ์ปจํ ์ด๋์ ๋ฐ๋ก ํฌํจ๋์ด ์์ฃ !? ์ฐ๋ฆฌ๊ฐ ์ํ๋ title์ ์ฐพ์๋ค์!!
๊ทธ๋์ CodingKeys์ ์ ์ํ title์, ์ง๊ธ ์ฐพ์ json์์์ title ์ ํ ๋นํด์ค๋ผ! ๋ผ๊ณ ํด์ค๋๋ค!
published, description 2๊ฐ์ง๋ title๊ณผ ๊ฐ์ depth์ ์์ผ๋ ๋๊ฐ์ด ์ ์ฉ ํด์ค๋๋ค.
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let snippetContainer = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .snippet)
self.title = try snippetContainer.decode(String.self, forKey: .title)
self.description = try snippetContainer.decode(String.self, forKey: .description)
self.published = try snippetContainer.decode(Date.self, forKey: .published)
}
์ฝ~๊ฐ ๋๋์ด ์กฐ๊ธ ๋ ์ค์๋์!?
์ด๋ฒ์๋ snippet ์ปจํ ์ด๋๋ก๋ถํฐ 2depth ํ์์ ์๋ url ํค๋ฅผ ์ฐพ์์, thumbnail์ ํ ๋นํด์ค๊ฑฐ์์!
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let snippetContainer = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .snippet)
self.title = try snippetContainer.decode(String.self, forKey: .title)
self.description = try snippetContainer.decode(String.self, forKey: .description)
self.published = try snippetContainer.decode(Date.self, forKey: .published)
let thumbnailContainer = try snippetContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .thumbnails)
let highContainer = try thumbnailContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .high)
}
์ด๋ ๊ฒ์! snippet ์ปจํ ์ด๋ ํ์์ nesting ๋์ด์๋ thumbnails ์ปจํ ์ด๋๋ฅผ ํ ๋นํด์ฃผ๊ณ ,
thumbnails ํ์์ nesting ๋์ด์๋ high ์ปจํ ์ด๋๊น์ง ํ ๋นํด์คฌ์ด์!
self.thumbnail = try highContainer.decode(String.self, forKey: .thumbnail)
๊ทธ๋ฆฌ๊ณ ์ ์ค์ ๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๋ thumbnail์ url ํค๊ฐ์ ์๋ ๋ ์์ ํ ๋นํด์ฃผ๋๊ฑฐ์ฃ !
์ฌ๊ธฐ์ .thumbnail ์ด๋ผ๊ณ ๋ง ์จ์คฌ๋๋ฐ, CodingKeys๋ฅผ ์ ์ํ ๋ url์ ์ฌ์ฉํ๋ผ๊ณ ๋ช ์ํด์คฌ๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ์จ์ค๋๋ค๐
๋ง์ฐฌ๊ฐ์ง๋ก videoId๊น์ง ๊ฐ์ ธ์จ ์ ์ฒด ์ด๊ธฐํ ์ฝ๋๋ ์๋์ ๊ฐ์์.
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let snippetContainer = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .snippet)
self.title = try snippetContainer.decode(String.self, forKey: .title)
self.description = try snippetContainer.decode(String.self, forKey: .description)
self.published = try snippetContainer.decode(Date.self, forKey: .published)
let thumbnailContainer = try snippetContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .thumbnails)
let highContainer = try thumbnailContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .high)
self.thumbnail = try highContainer.decode(String.self, forKey: .thumbnail)
let resourceIdContainer = try snippetContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .resourceId)
self.videoId = try resourceIdContainer.decode(String.self, forKey: .videoId)
}
์ด์ ์ข ๋๋์ด ์ค์์ฃ ~~? ใ ใ ๐ค
์.. ๊ทผ๋ฐ ์ items์ ๋ํ CodingKey๋ ์์จ์คฌ๋์ง ๊ถ๊ธํ์ฃ ~~? items๋ ๋ฐ๋ก ๋นผ์ฃผ์์ด์!
์ด ์์ค๋ ์์์ ํด์จ ๊ณผ์ ๊ณผ ์์ ๋์ผํด์ ์ฝ๊ฒ ์ดํด ๊ฐ๋ฅํ์ค๊ฑฐ์์ ๐ค
struct Response: Decodable {
var items: [Video]?
enum CodingKeys: String, CodingKey {
case items
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.items = try container.decode([Video].self, forKey: .items)
}
}
์ด๋ ๊ฒ ๋ฐ๋ก Response Object๋ฅผ ์ ์ํด์ ๋นผ์คฌ๋ต๋๋ค! ์ค์ ๋ก ๋์ฝ๋ฉ ๊ณผ์ ์์ ์๋์ฒ๋ผ ์๋ณํ๊ธฐ ์ํจ์ด์์ ๐
let response = try decoder.decode(Response.self, from: data!)
์ค๋์ CodingKey์ ๋ํด ๋ค์ ๋ณต์กํ ์์ ๋ฅผ ๊ฐ์ง๊ณ ์ค๋ช ํด๋ดค๋๋ฐ์!
์ฌ์ด ์์ ๋ง ๋ณด๋ค๊ฐ ์ด๋ ค์ด ์ค์ ์ ๋ง๋๋ ๊ฒ๋ณด๋ค๋.. ์ด๋ ต๊ฒ ๊ณต๋ถํ๊ณ ์ค์ ์์ ์ฝ๊ฒ ๋ง๋์๋ ์ทจ์ง์์.. ๐
์ค๋๋ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋์๊ธธ ๋ฐ๋์!! ๐
'iOS [Swift] > ๊ธฐ์ด๋ฅผ ํํํ!' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] typealias (0) | 2021.02.26 |
---|---|
[Swift] Codable (0) | 2021.02.26 |
[Swift] Cloud Firestore(2) ์ค์ตํด๋ณด๊ธฐ (0) | 2021.02.10 |
[Swift] Cloud Firestore(1) ๋ฐ์ดํฐ ๊ตฌ์กฐ (1) | 2021.02.08 |
[Swift] ScrollView + PageControl (0) | 2021.02.05 |