json์ ํ์ฑํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค. ๋ค๋ฅธ ํ๋๋ ๋ค์ ๊ธ์์ ์์๋ณด๊ฒ ๋ค. (๋ง๊ด๋ถ)
Codable ์ด๋?
-> ์์ ์ ๋ณํํ๊ฑฐ๋ ์ธ๋ถ ํํ(ex> json)์ผ๋ก ๋ณํํ ์ ์๋ ํ์
๋ณดํต์ json์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ค! ๊ทธ๋์ ์๋ ์์๋ json ํ์ ์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณผ ๊ฒ์ด๋ค.
Encodable๊ณผ Decodable์ ํตํ์ ๊ฒ
typealias๋ ๋ญ์ง ??
* typealias - ๊ธฐ์กด ์ ์ธ๋ ๋ฐ์ดํฐ ํ์ ์ ๋ณ์นญ์ ์ฌ์ฉํจ์ผ๋ก์ ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๋๋ก ๋ง๋๋ ๋ฌธ๋ฒ
์๋ฅผ ๋ค์ด์ typealias Name: String ์ด๋ผ ํ์ ๋
let name: Name = "ํ๊ธธ๋" == let name: String = "ํ๊ธธ๋"
๊ธฐ์กด ํ์ String์ ๋ณ๋ช ์ Name์ผ๋ก ํ์๋ ์ํ String ์ค์์ ํน๋ณํด Name๋ง์ผ๋ก ๋ฒ์๋ฅผ ์ขํ ํ์ ์ด๊ตฌ๋ ํ๊ณ ์์ ์๋ ๊ฒ์ด๋ค.
Codable์ ํ๋กํ ์ฝ์ด๋ค! ๋ฐ๋ผ์ Codable์ ์ด๋ฃจ๊ณ ์๋ Encodable๊ณผ Decodable ์ญ์ ํ๋กํ ์ฝ๋ก
enum, class, struct ์์ ์ฑํํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
codable์ ์ฑํํ๊ฒ ๋๋ฉด ์ธ๋ถ ํํ์ผ๋ก ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ผ๋ก struct๋ก ํํ๋ ๋ฐ์ดํฐ๋ฅผ json๊ณผ ๊ฐ์ ์ธ๋ถ ํํ์ผ๋ก ๋ง๋ค์ ์๋ค๋ ๋ง์ด๋ค.
Encodable - ์ํ๋ ํํ๋ก ๋ฐ๊พธ์ด์ค (f(x) ํจ์์ ๊ฐ๋ค)
->์๊ธฐ ์์ ์ ์ธ๋ถ ํํ์ผ๋ก encode ํ ์ ์๋ ํ์
Decodable - ๊ทธ ํํ๋ฅผ ํด์ํด์ค(f-1(x) ์ญํจ์์ ๊ฐ๋ค)
์๊ธฐ ์์ ์ ์ธ๋ถ ํํ์ผ๋ก decode ํ ์ ์๋ ํ์
์ฐธ๊ณ ๋ก Decodable์ ์ฑํํ๋ ๋ฐ์ดํฐ๋ initํจ์๋ฅผ ํ์์ ์ผ๋ก ๊ฐ์ ธ์ผ ํ๋ค
๊ณต์ ๋ฌธ์์ ๊ทธ๋ ๊ฒ ๋์์์ ใ ใ
์ด๋ป๊ฒ ํด์ฃผ์ด์ผ ํ ๊น Codable ์ด ๋ ์์ ์ฌ์ฉ๋ฒ์ด ๊ถ๊ธํ๋ค ..!
encodable๋ถํฐ ์ฐจ๊ทผ ์ฐจ๊ทผ ์์๋ณด๋๋ก ํ์
์๋ฅผ ๋ค์ด user struct๊ฐ ์๋์ ๊ฐ์ด ์๋ค
struct User {
var userName: String
var userEmail: String
}
1. ๋จผ์ encoder ์ ์ธ
let encoder = JSONEncoder()) //์ธ๋ถ ํํ ๊ทธ ์ค json์ผ๋ก encode ํด์ฃผ๋ ๊ฐ์ฒด
2. struct๋ฅผ ์ค์ฒดํํ ์ธ์คํด์ค ์์ฑ
let uri = User(userName: "Uri", userEmail: "spqjf12345@gmail.com")
3. encode ํ๊ธฐ
let jsonData = try? encoder.encode(uri) //encode ํจ์๋ codable์ ์ค์ํ๋ uri๋ฅผ encode
๊ทธ๋ฌ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์ด๋ ๊ฒ json ํํ๋ก ์ encoding ๋์๋ค ใ ใ
if let jsonData = jsonData, let jsonString = String(data: jsonData, encoding: .utf8) {
print(jsonString)
} -> {"userName" : "uri", "userEmail" : "spqjf12345@gmail.com"}
๋ฐ๋๋ก decode๋ ?
what? {"userName" : "uri", "userEmail" : "spqjf12345@gmail.com"} ์ decode ํด์ค ๊ฒ์ด๋ค.
1. ์ฐ์ jsonDecoder ์ ์ธ
let decoder = JSONDecoder()
2. json์ data๋ก ๋ง๋ค๊ธฐ
var data = jsonString.data(using: .utf8)
3. data๋ฅผ ์ธ์คํด์คํ
if let result = try? decoder.decode(User.self, from: data) {
return result.userName //uri
}
codingKey ๋?
๋ง์ฝ ์ฐ๋ฆฌ์ User ๋ฐ์ดํฐ๊ฐ
struct User: Codable {
var userName: String
var userEmail: String
}
jsonData ํํ
{
"user_name" : "uri",
"user_email": "spqjf12345@gmail.com"
}
์ผ๋ก ๋์ด์์๋
์ด jsonData๋ฅผ User ๋ฐ์ดํฐ ํ์ ์ผ๋ก decodeํ๊ฒ ๋ ์
์๋ฌ๊ฐ ๋๊ฒ๋๋ค. ์? key ๊ฐ์ ์ด๋ฆ์ด ๊ฐ์ง ์๊ธฐ ๋๋ฌธ
์ด๋ฅผ ์ํด codingKey๋ผ๋ protocol์ด ์กด์ฌํ๋ค.
์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ์ ์ํ ํค๋ก ์ฌ์ฉํ ์ ์๋ ํ์
enum์ ์ฌ์ฉํด codingKey ํ๋กํ ์ฝ์ ์ฑํํ๊ฒ ํ๋๊ฒ
๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ์ธ์ ๋ User struct๋
struct User: Codable {
var userName: String
var userEmail: String
}
//codingKey ์ถ๊ฐ
struct User: Codable {
var userName: String
var userEmail: String
enum CodingKeys: String, CodingKey {
case userName = "user_name"
case userEmail = "user_email"
}
}
์ด๋ ๊ฒ ๋ ๊ฒ์ด๋ค!
ํ๋ ํ๋ ๋ฏ์ด ํด์ํด๋ณด๋ ๊ธฐ์กด์
result["userName"] as? String ์ด๋ฐ ์์ผ๋ก key๊ฐ๊ณผ value๊ฐ์ ๊ตฌ๋ถํด ๋ค์ userData์ append ํด์ฃผ๋ ๊ฒ๋ณด๋ค ํจ ๊ฐ๋จํ ๋ฐฉ์์ธ๊ฑฐ ๊ฐ๋ค ๋ง์ด ์ ์ฉํด์ผ์ง ใ ใ
์ฐธ๊ณ :
'IOS๐ > iOS+Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] CustomStringConvertible (0) | 2022.03.07 |
---|---|
[iOS/swift] ์ ์ฉํ ์ฌ์ดํธ ์ ๋ฆฌ ๋ชจ์.zip (0) | 2021.07.03 |
[iOS] View Controller ์๋ช ์ฃผ๊ธฐ (0) | 2021.05.03 |
[iOS] Layout ์ ๋ฆฌ (0) | 2021.04.27 |
[iOS] UIScene, UIWindowScene, UISceneSession (0) | 2021.04.16 |
๋๊ธ