Focus On Develop ๐ŸคŸ๐ŸคŸ

[Swift] Codable ๋ณธ๋ฌธ

iOS [Swift]/๊ธฐ์ดˆ๋ฅผ ํƒ„ํƒ„ํžˆ!

[Swift] Codable

๋ˆ„๋ฆฌ๋‹ฌ์ดํ‹€ 2021. 2. 26. 22:40

์šฐ๋ฆฌ๊ฐ€ ๋„คํŠธ์›ํ†ต์‹  ๋“ฑ์„ ํ†ตํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์ฃ !

์–ด๋–ค ์›น์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋ฐ›์„์ˆ˜๋„ ์žˆ๊ณ , ์–ด๋–ค ์›น์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด์„œ ์„œ๋ฒ„์— ์ „์†กํ•˜๊ธฐ๋„ ํ•˜์ฃ ,

๊ฐ€์žฅ ๋ณดํŽธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํฌ๋งท์ด ๋ฐ”๋กœ json ํฌ๋งท์ด์—์š”!

 

{
	"name": "Nury",
	"age": 10,
	"birthDate": "2021-02-26T12:15:17+0000"
}

์ด๋ ‡๊ฒŒ ์ƒ๊ธด ๋…€์„๋“ค ๋งŽ์ด ๋ณด์…จ์ฃ ~~?

jsonํฌ๋งท์€ ์ด๋ ‡๊ฒŒ [key : value] ๋กœ ๋ฌถ์ธ ๋งˆ์น˜ Dictionary ํ˜•ํƒœ์˜ ํฌ๋งท์ด์—์š” ใ…Žใ…Ž

 

Swift์—์„œ๋Š” Codable์ด๋ผ๋Š” ๋…€์„์„ ํ†ตํ•ด json์„ ์•ฑ์˜ Object๋กœ, ์•ฑ์˜ Object๋ฅผ json์œผ๋กœ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”!

๊ทธ๋Ÿผ~~ Codable์ด๋ผ๋Š”๊ฒŒ ๋ญ๋ƒ๋ฉด~~~

 

์ž์‹ ์„ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ํ‘œํ˜„(json๊ฐ™์€)์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

๊ทผ๋ฐ Decodable & Encodable ์ด๋ผ๋Š” ํƒ€์ž…์„ Codable ํƒ€์ž…์œผ๋กœ ์ •์˜ํ•ด๋†จ๋„ค์š”! 

๊ทธ๋Ÿผ Decodable, Encodable์— ๋ญ”๊ฐ€์š”~?

 

์ •์˜๋ฅผ ๋ณด๋‹ˆ ์ด๊ฑด ๋‘˜๋‹ค ์–ด๋–ค ํ”„๋กœํ† ์ฝœ์ด๋„ค์š”!

๊ทธ๋Ÿฌ๋ฉด, "Codable์€ Decodable๊ณผ Encodeble ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…(ํ”„๋กœํ† ์ฝœ)์ด๋‹ค." ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”!

์Œ~~ ์ข‹์•„. ๊ทผ๋ฐ Decodable๊ณผ Encodeble์€ ๋ญํ•˜๋Š” ์• ๋“ค์ด์•ผ? ๐Ÿ˜‚

 

Decodable : ์ž์‹ ์„ ์™ธ๋ถ€ํ‘œํ˜„(json๋“ฑ)์—์„œ ๋””์ฝ”๋”ฉ ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…

Eecodable : ์ž์‹ ์„ ์™ธ๋ถ€ํ‘œํ˜„(json๋“ฑ)์œผ๋กœ ์ธ์ฝ”๋”ฉ ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…

 

๊ทธ๋Ÿผ.. ๋””์ฝ”๋”ฉ, ์ธ์ฝ”๋”ฉ์€ ๋ญ๋ƒ,

๋””์ฝ”๋”ฉ : json๊ฐ™์€ ์™ธ๋ถ€ ํฌ๋งท์„ ์•ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Object๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ!

์ธ์ฝ”๋”ฉ : ์•ฑ์˜ Object ํƒ€์ž…์„ json๊ฐ™์€ ์™ธ๋ถ€ ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ!

 

๋‘˜์€ ์™„์ „ ๋ฐ˜๋Œ€์˜ ๊ฐœ๋…์ด์ฃ ~~? ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ๋„ ์™„์ „ํžˆ ๋ฐ˜๋Œ€์—์š”! ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณผ๊ฒŒ์š”.

 

Decodable

let jsonString = """
{
    "name": "Nury",
    "age": 10,
    "birthDate": "2021-02-26T12:15:17+0000"
}
"""

์œ„์—์„œ ๋ดค๋˜ ์ด๋Ÿฐ ๋…€์„์„ ์•ฑ์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ๋””์ฝ”๋”ฉ ํ•ด๋ณผ๊ฑฐ์—์š”!

 

struct Person: Codable {
    var name: String
    var age: Int
    var birthDate: Date
}

๋จผ์ € ๋ณ€ํ™˜ํ•  ํƒ€์ž…์„ ์ •์˜ํ•ด์ค๋‹ˆ๋‹ค! ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ Codable ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ–ˆ๋‹ค๋Š” ๊ฑฐ์—์š”!

๊ทธ๋ฆฌ๊ณ , ๋ˆˆ์น˜์ฑ„์…จ๊ฒ ์ง€๋งŒ jsonํŒŒ์ผ์˜ key๊ฐ’๊ณผ, Object์˜ ํ”„๋กœํผํ‹ฐ๋ช…์„ ์ด๋ ‡๊ฒŒ ๋งž์ถฐ์ค˜์•ผ ์•„~ ์–˜๊ฐ€ ์–˜๊ตฌ๋‚˜~~ ํ•˜๊ณ  ๋ณ€ํ™˜์ด ๋˜์š”.

๋งŒ์•ฝ ํ‚ค๊ฐ’์ด ๋‹ฌ๋ผ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ฉด, CodingKey๋ผ๋Š” ๋…€์„์„ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค!!

 

๊ทธ๋Ÿผ ๋จผ์ € ๋ณ€ํ™˜ ๋‹จ๊ณ„๋ฅผ ์‚ดํŽด๋ณด๊ณ , ํ•˜๋‚˜์”ฉ ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณผ๊ฒŒ์š”!

 

  1. JSONDecoder ์„ ์–ธ
  2. String ํƒ€์ž…์˜ json์„ Dataํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค๊ธฐ.
    (์˜ˆ์‹œ์—์„œ๋Š” ์ง„์งœ .json ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ String์œผ๋กœ ์ž„์˜๋กœ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™˜ํ•˜๋Š”๊ฑฐ์—์š”! ์ง„์งœ json์€ dataํƒ€์ž…์ž…๋‹ˆ๋‹ค.)
  3. Dataํƒ€์ž…์„ JSONDecoder๋ฅผ ํ†ตํ•ด Object๋กœ ๋งŒ๋“ค๊ธฐ

 

1. JSONDecoder ์„ ์–ธ

let decoder = JSONDecoder()

 

2. String ํƒ€์ž…์˜ json์„ Dataํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค๊ธฐ.

let jsonData = jsonString.data(using: .utf8)

string.data() ๋ฉ”์†Œ๋“œ์˜ ๋ฆฌํ„ด์€ Data? ํƒ€์ž…์ด์—์š”! ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ํ•ด์ค์‹œ๋‹ค.

 

3. Dataํƒ€์ž…์„ JSONDecoder๋ฅผ ํ†ตํ•ด Object๋กœ ๋งŒ๋“ค๊ธฐ

if let jsonData = jsonString.data(using: .utf8) {
    let person = try decoder.decode(Person.self, from: jsonData)
}

์šฐ๋ฆฌ๋Š” JSONDecoder๊ฐ€ ๊ฐ€์ง„ decode() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋””์ฝ”๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”! 

๊ทธ๋Ÿผ decode() ๋ฉ”์†Œ๋“œ์˜ ์ •์˜๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”~?

๋จผ์ € type์€ ์šฐ๋ฆฌ๊ฐ€ ๋””์ฝ”๋”ฉ ํ›„์— ์ด type์œผ๋กœ ๋งŒ๋“ค๊ฑฐ์•ผ. ์ฆ‰ "Decode ํ•  ๊ฐ’์˜ ํƒ€์ž…"์ด๋ผ๋Š” ๊ฑฐ์—์š”,

์ด๊ฒŒ T.Type์ด๋ผ๊ณ  ๋˜์–ด์žˆ์ฃ ? ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ฅธ์ชฝ์— ๋ณด์‹œ๋ฉด T where T : Decodable ์ด๋Ÿฐ๊ฒŒ ์žˆ๋„ค์š”!

์ฆ‰ ์ด๋ง์€, type์€ ์–ด๋–ค ํƒ€์ž…(T.Type)์ธ๋ฐ, Decodable์„ ์ค€์ˆ˜ํ•ด์•ผ๋งŒ ๋ผ! ๋ผ๊ณ  ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๋„ค์š”!

 

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” Person ํƒ€์ž…์œผ๋กœ ๋””์ฝ”๋”ฉ์„ ํ•ด์ค„๊ฑฐ๊ณ , Person์€ Codable(Decodable์„ ํฌํ•จํ•˜๋Š”) ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ–ˆ์ฃ !?

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์šฐ๋ฆฌ๋Š” Personํƒ€์ž…์„ ์ € type์ž๋ฆฌ์— ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”! ๐Ÿ‘

 

๊ทธ๋ฆฌ๊ณ  data๋Š” ๋””์ฝ”๋”ฉํ•  ์†Œ์Šค๋ฐ์ดํ„ฐ๋ฅผ ๋งํ•˜๋Š”๊ฑฐ์—์š”! ์ด data๋ฅผ ์ € type์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค˜! ํ•˜๋Š”๊ฑฐ์ฃ .

let person = try decoder.decode(Person.self, from: jsonData)

์ž, ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ด ์ฝ”๋“œ๊ฐ€ ์ดํ•ด๊ฐ€ ๋˜์‹œ๋‚˜์š”?ใ…Žใ…Ž ๐Ÿ˜Ž

๋””์ฝ”๋”ฉ๋„ ํ–ˆ์œผ๋‹ˆ ์ƒˆ๋กœ๋งŒ๋“  person๋…€์„์„ ์ข€ ์ถœ๋ ฅํ•ด๋ณผ๊นŒ์š”?

if let jsonData = jsonString.data(using: .utf8) {
    let person = try decoder.decode(Person.self, from: jsonData)
    
    print("name : \(person.name)")
    print("age : \(person.age)")
    print("birth : \(person.birthDate)")
}

ํ—‰.. ๋ญ”๊ฐ€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค!!

"Doubleํƒ€์ž…์˜ ๋””์ฝ”๋”ฉ์„ ์˜ˆ์ƒํ–ˆ์ง€๋งŒ, String, Dataํƒ€์ž…์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค" ๋ผ๊ณ  ํ•˜๋„ค์š”!

์ด๊ฑด ๋ฐ”๋กœ birthDate๊ฐ€ Date ํƒ€์ž…์œผ๋กœ ์ •์˜๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ์š”!

์•„๋ฌด๋ฆฌ Codable์ด ๋งค์šฐ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๋‹ค๊ณ ๋Š” ํ•˜์ง€๋งŒ,,, ์ด๋ ‡๊ฒŒ ๋‚ ์งœํฌ๋งท์˜ String์„ Date๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”,

decoder.dateDecodingStrategy = .iso8601

์ด๋ ‡๊ฒŒ ๋””์ฝ”๋”์—๊ฒŒ ๋‚ ์งœ ํฌ๋งท์€ ์–ด๋–ป๊ฒŒ ํ• ๊ฑฐ์•ผ? ํ•˜๊ณ  ์ „๋žต์„ ์ง€์ •ํ•ด์ค˜์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด์š”!

 

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์‹คํ–‰์„ ํ•ด๋ณด๋ฉด....

์ง ~~~ ์ž˜ ์ถœ๋ ฅ ๋˜์—ˆ๋„ค์š”!!

json์„ ๊ฐ€์ ธ์™€์„œ ์•ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” Object๋กœ JSONDecoder๋ฅผ ํ†ตํ•ด์„œ ๋””์ฝ”๋”ฉํ•˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด ๋ณด์•˜์Šต๋‹ˆ๋‹ค ๐Ÿ‘๐Ÿ‘

 

Encodable

์ด์ œ๋Š” Encodable์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑด๋ฐ์š”! Encoding์€ Decoding๊ณผ ์™„์ „ ์ •๋ฐ˜๋Œ€ ๊ฐœ๋…์ด์˜€๊ณ , ๊ตฌํ˜„๋„ ์ •๋ฐ˜๋Œ€๋ผ๊ณ  ํ–ˆ์ฃ !?

 

  1. JSONEncoder ์„ ์–ธ
  2. Object ํƒ€์ž…์„ JSONEncoder๋ฅผ ํ†ตํ•ด Dataํƒ€์ž…(json)์œผ๋กœ ๋งŒ๋“ค๊ธฐ
  3. Dataํƒ€์ž…์„ Stringํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค๊ธฐ
    (์˜ˆ์‹œ์—์„œ๋Š” Stringํƒ€์ž…์œผ๋กœ ์ถœ๋ ฅํ•ด๋ณด๋ ค๊ณ  ํ•˜๋Š”๊ฑฐ์—์š”! ์‹ค์ œ๋กœ API์˜ Body์— ํ˜ธ์ถœํ• ๋•Œ๋Š” Dataํƒ€์ž… ๊ทธ๋Œ€๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค)

 

1. JSONEncoder ์„ ์–ธ

let encoder = JSONEncoder()

 

2. Object ํƒ€์ž…์„ JSONEncoder๋ฅผ ํ†ตํ•ด Dataํƒ€์ž…(json)์œผ๋กœ ๋งŒ๋“ค๊ธฐ

let data = try encoder.encode(person)

์ด๋ฒˆ์—๋Š” JSONEncoder์˜ encode() ๋ฉ”์†Œ๋“œ๋กœ Dataํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด ์คฌ๋„ค์š”!

๊ทธ๋Ÿผ encode() ๋ฉ”์†Œ๋“œ์˜ ์ •์˜๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”~?

 

Encodable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” T๋ผ๋Š” ์–ด๋–ค ๋ฐ์ดํ„ฐํƒ€์ž…์„ Dataํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๋„ค์š”~!

 

์šฐ๋ฆฌ๋Š” ์œ„์—์„œ person Object๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , ์ด person์€ Personํƒ€์ž…์ด์˜€์ฃ !? ๊ทธ๋ฆฌ๊ณ  Person์€ Codableํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋‹ˆ๊นŒ ๋‹น์—ฐํžˆ Encodable๋„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ๊ฒ ์ฃ ! ๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” ์ด person์„ value๋กœ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”!

 

์‹ค์ œ๋กœ ์›น์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด json ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ• ๋•Œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Post๋ฐฉ์‹์„ ํ†ตํ•œ APIํ˜ธ์ถœ๋กœ ์ด๋ฃจ์–ด์ ธ์š”.

๊ทธ๋•Œ body์— ์ด Dataํƒ€์ž…์˜ json์„ ๊ทธ๋Œ€๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

 

์šฐ๋ฆฌ๋Š” ์‹ค์Šต์ด๋‹ˆ๊นŒ, ์ด Dataํƒ€์ž…์„ Stringํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ํ•œ๋ฒˆ ์ถœ๋ ฅํ•ด๋ณผ๊ฒŒ์š”!

 

3. Dataํƒ€์ž…์„ Stringํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์ถœ๋ ฅํ•ด๋ณด๊ธฐ

if let jsonString = String(data: data, encoding: .utf8) {
        print(jsonString)
    }

์˜ค~~ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋˜ json ํฌ๋งท์œผ๋กœ ๋ณ€ํ˜•์ด ๋๋„ค์š”!! ๊ทผ๋ฐ.. ์ € birthDate์˜ 6360์–ด์ฉŒ๊ตฌ ์ €์ฉŒ๊ตฌ๋Š” ๋ญ์ฃ ..!? 

์ด๊ฑด decoder์— date ํฌ๋งท ์ „๋žต์„ ์คฌ๋˜ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์•„์š”!

encoder.dateEncodingStrategy = .iso8601

์˜คํ˜ธ~~ ์ž˜ ๋‚˜์˜ค๋„ค์š”!! ๐Ÿ‘

ํ•œ๊ฐ€์ง€, decoder๋‚˜ encoder์— dateํฌ๋งท ์ „๋žต์„ ์ค„๋•Œ iso8601์ด๋ผ๋Š” ํ‘œ์ค€ ๊ทœ๊ฒฉ๋งŒ ์ฃผ๊ณ  ์žˆ์ฃ ~?

์ด๊ฑฐ ์™ธ์—๋„ Custom DataFormatter๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›ํ•˜๋Š” ํฌ๋งท์œผ๋กœ๋„ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ต๋‹ˆ๋‹ค ๐Ÿ˜Ž

 

์Œ.... ๊ทผ๋ฐ.. ์•„์ง๋„ ์•ฝ~๊ฐ„ ์•„์‰ฝ์ฃ !? ์šฐ๋ฆฌ๋Š” ์ต์ˆ™ํžˆ ๋ณด๋˜ ์ด์œ ํฌ๋งท์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์‹ถ์€๋ฐ์š” ๐Ÿ˜‚

encoder.outputFormatting = .prettyPrinted

encoder์— ๋‚ ์งœํฌ๋งท์— ๋Œ€ํ•œ ์ „๋žต์„ ์คฌ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ์ถœ๋ ฅ ํฌ๋งทํŒ…์„ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์–ด์š”!

์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ ํฌ๋งท์„ .prettyPrinted๋กœ ์ •ํ•ด์ฃผ๊ณ  ๋‹ค์‹œ ์ถœ๋ ฅ์„ ํ•ด๋ณด๋ฉด! 

์™€~~ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” json ๋ฐ์ดํ„ฐ๋กœ ๋‹ค์‹œ ๋ณ€ํ˜•์ด ๋˜์—ˆ๋„ค์š”!!! ๐Ÿค™๐Ÿค™

 

 

์˜ค๋Š˜์€ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ Codable์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ , ์‹ค์ œ๋กœ Decoding, Encodingํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ค์Šตํ•ด๋ณด์•˜์–ด์š”!!

์˜ค๋Š˜๋„ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ๊ธธ ๋ฐ”๋ž˜์š” ๐Ÿ™

 

 

'iOS [Swift] > ๊ธฐ์ดˆ๋ฅผ ํƒ„ํƒ„ํžˆ!' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift] CaseIterable  (0) 2021.02.27
[Swift] typealias  (0) 2021.02.26
[Swift] CodingKey  (0) 2021.02.26
[Swift] Cloud Firestore(2) ์‹ค์Šตํ•ด๋ณด๊ธฐ  (0) 2021.02.10
[Swift] Cloud Firestore(1) ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ  (1) 2021.02.08
Comments