์ดํธ์ ๋จ์ ์ด ์กด์ฌํจ์ผ๋ก ๋๊น์ง ์ฝ๊ธฐ์ ๋ค์ํธ์ ํ์๋ก ์ฝ๋ ๊ฒ์ ๊ถ์ฅ!
์ง๋ ํธ์ ์ด์ด์ ์งํ!
์ง๋๋ฒ์ ๊ธ์ ์ฃผ์ ๊ฐ Property Wrapper
์ ๊ธฐ๋ณธ๊ณผ UserDefault
์ ์ ์ฉํ๋ ๊ธ์ด์๋ค๋ฉด,
์ด๋ฒํธ์ Codable
์ ์ ์ฉ์ ํด๋ณด๋ ๊ฒ์ด ์ด๋ฒ ๊ธ์ ์ฃผ์ !
์ ํํ๋ Decodable์ ์ ์ฉ! ํ์ง๋ง Codable์ด ๋ ์ต์ํ ํ ๋ Codable์ด๋ผ ํ๊ธฐ.
์ด ํฌ์คํ ์ ํ๊ฒ๋ ์ด์
๋ค์๊ณผ ๊ฐ์ JSON
์ด ์๋ค๊ณ ํด๋ณด์
{
"isHidden" : "Y"
}
ํด๋น ์ฝ๋๋ฅผ ๋ณด๋ฉด ์์ฌ์์ด ์๋ค.
isHidden
์ Bool
ํ์
์ด ์๋์ฌ์ ์กฐ๊ฑด๋ฌธ(if
or switch
) ๋ฑ์์ String
๋น๊ต๊ฐ ๋ค์ด๊ฐ๋ค
// ์ ์ ์กฐ๊ฑด: Model์ด๋ ๊ตฌ์กฐ์ฒด์ ํ์ฑ ๋์๋ค๋ ๊ธฐ์คํ์ ์์ฑ
if model.isHidden == "Y" {
// ์ด๋ค ์ด๋ค ์ฒ๋ฆฌ
}
ํ์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋๊ธธ ๋ฐ๋๋ค.
if model.isHidden {
// ์ด๋ค ์ด๋ค ์ฒ๋ฆฌ
}
๊ทธ๋ ๊ฒ ๋๊ธฐ ์ํด์ isHidden
์ด๋ผ๋ ๊ฐ์ด Bool
ํํ์ฌ์ผ ํ๋ค.
์ด ์ ์ ์ด์ ์ CodingKey
๊ด๋ จ ๊ธ์์ ํด๊ฒฐํ์๋ค. ์ฐธ๊ณ
๊ฐ์ ํ ๊ฒ์ ๋จ์
์์ ๋ฐฉ์์ ์ค์ ์ฌ์ฉํ๋ ์ฝ๋์์ ๋ด๊ฐ ์ํ๋ ์คํ์ผ๋ก ์ฝ๋ฉ์ ํ ์ ์์ด์ ์ข์๋ค.
ํ์ง๋ง, ๋จ์ ์ด ๋ฐ๋ผ์๋ค.
init(from decoder: Decoder) throws {}
ํด๋น ์ฝ๋๊ฐ ๊ฐ์ด ์กด์ฌํด์ผํ๋ค.
๋ค์๋งํด, ๋ค์ ์ฝ๋์ ์ฃผ์1,2์ ๊ฐ์ด ๊ฐ ํ๋กํผํฐ๋ค์ ๋ค ์ด๊ธฐํ ํด์ฃผ์ด์ผ ํ๋ค.
// ์ด์ ๊ธ์ค ์ผ๋ถ ๋ถ๋ถ (https://jiseobkim.github.io/swift/network/2021/05/26/swift-CodingKey-API์-๋ค๋ฅธ-์๋ฃํ-์ฐ๊ธฐ.html)
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
// 1. ์ฌ์ฉ์๋ช
์ด๊ธฐํ
self.userName = try container.decode(String.self, forKey: .userName)
// 2. ์จ๊น์ฒ๋ฆฌ ์ด๊ธฐํ
self.isHidden = try container.decode(String.self, forKey: .isHidden) == "Y"
}
์ฌ๊ธฐ์๋ ๊ฐ์ด 2๊ฐ๋ค. ๋ฐ๋ผ์ ๋ผ์ธ๋ 2์ค์ด ๋ฐ๋ผ์จ๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ๋ง์ฝ ์๋ฃํ์ ๋ฐ๊พธ๊ฒ ๋๋ค๋ฉด ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ฑฐ๋ ์ฌํ๋ฉด ๋ผ์ธ์ด ๋ช์ค ์ถ๊ฐ๊ฐ ๋๋ค.
์ฃผ์ 2๋ฒ๊ณผ ๊ฐ์ด ์๋ฃํ ๋ณ๊ฒฝ์ด๋ ํ๋กํผํฐ๊ฐ ๋ง๋ค๋ฉด
๊ฐ init
ํํธ๋ง๋ค ๋ผ์ธ์ ์๋ ๊ฐ์ด ์ฆ๊ฐํ๊ฒ ๋๋ค.
์ด๊ฒ ์๊ทผ ๊ท์ฐฎ๋ค.
ํธํ์๊ณ ํ๊ฑด๋ฐ, ํธํ์๊ณ ์ค๋น๊ฐ ๋๋ฌด ๊ธด ๋๋์ด๋๊น?
๊ทธ๋์ ๋ฐ๋ณต์ ์ธ ์ด ๋ถ๋ถ์ ๊ฐ์ ํ๊ณ ์ถ์๋ ์ฐฐ๋์ Property Wrapper๋ฅผ ์ ์ฉ ๊ฐ๋ฅํ ๊ฒ์ ์๊ฒ ๋์๋ค.
Property Wrapper์ Codable
UserDefault
์์๋ ๋ณด์๋ฏ์ด Property Wrapper
๋ฅผ ์ด์ฉํ์ฌ ๋ฐ๋ณต์ ์ธ ํ์๋ฅผ ์ ๊ฑฐํ์๋ค. ์ฌ๊ธฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ค.
์ด๊ธฐํ ๊ณผ์ ์์ ๋ฐ๋ณต๋๋ ํ์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ๋ชฉ์ !
Property Wrapper ์์ฑ
@propertyWrapper
struct StringBoolConverter {
let wrappedValue: Bool
}
์ด๋ฆ๊ณผ ๊ฐ์ด Bool
์ด์ง๋ง ๊ฐ์ String
์ธ ๊ฒ์ ๋ฐ๊ฟ์ฃผ๋ ๊ทธ๋ฐ ์ญํ ์ด๋ค.
์ด์ ๊ณผ๋ ๋ค๋ฅด๊ฒ init
๋ถ๋ถ ๋ํ ์์ผ๋ฉฐ get/set
๋ถ๋ถ๋ ์๋ค.
init
์ด ์๋ ์ด์ ๋Decodable
์ ์ํด ์ด๊ธฐํ๊ฐ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.get/set
์ด ์๋ ์ด์ ๋UserDefault
์ฒ๋ผ ๊ฐ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฐ์ฐ์ด ํ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๊ฑฐํ๋ค๊ฐ ์ ๋ฒ๊ธ์ Property Wrapper๋ฅผ โํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ ํ ๋, ์ฐ์ฐ ํ๋กํผํฐ(getter/setter) ๊ฐ๋ ์ ์ถ๊ฐ ์ ์ฉํ๋ ๊ฒ (100% ๊ฐ์ธ ์๊ฐ)โ ๋ผ๊ณ ์์ฝํ๋๋ฐ, ์ด ๋ง์ ๋ํด ์กฐ๊ธ ๋ ๊ณ ๋ฏผ ํด๋ด์ผ๊ฒ ๋ค. โ์ด๊ธฐํ๋ฅผ ์ปค์คํ ํ ์ ์๋ค.โ ๋ผ๋ ๋ง์ด ๋ ์ด์ธ๋ฆด๋ ค๋โฆ?
๊ทธ๋ผ ์ด์ Extension
์ ํด๋ณด์
extension StringBoolConverter: Codable {
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let stringBool = try? container.decode(String.self)
wrappedValue = stringBool == "Y"
}
}
์ด ๋ถ๋ถ์ ์ด๋ ต์ง ์์ ๊ฒ์ด๋ค.
๋ด ๋ธ๋ก๊ทธ์์ ๋์ค์ง ์์ singleValueContainer()
์ ๊ฒฝ์ฐ ํ๋กํผํฐ ๋ค์๊ณผ ๋์ผํ ๊ฒ์ ์ฐพ์์ decode
ํด์ฃผ๋ ์ญํ ์ธ๋ฏํ๋ค.
CodingKey
๋ฅผ ๋ฐ๋ก ์์ฑํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ ๋ฐฉ์์ผ๋ก ์์๋๋ค.
์ฐ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ชจ๋ธ์ ๋ณด์
struct Model: Codable {
@StringBoolConverter var isHidden: Bool
}
์์ฃผ ๊ฐ๋จํ๋ค!
@StringBoolConverter
๋ง ๋ถ์ฌ์ฃผ๋ฉด ์ด isHidden
์ด๋ผ๋ ๊ฐ์ String
์ผ๋ก ์จ Y
๋๋ N
๊ฐ์ ์ํด Bool
๋ก ๋ณํ ๋์ด ์ด๊ธฐํ๊ฐ ๋๋ค.
์ค์ ๋ก ์ฐ๊ณ , ์ถ๋ ฅ๋ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์๋์๋ค!
์ ์ฒด ์ฝ๋๋ฅผ ๋น๊ตํด๋ณด์.
Property Wrapper ์ฌ์ฉ ์
struct Model: Codable {
let isHidden: Bool
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
self.isHidden = try container.decode(String.self) == "Y"
}
}
Property Wrapper ์ฌ์ฉ ํ
struct Model: Codable {
@StringBoolConverter var isHidden: Bool
}
init
๋ถ๋ถ์ด ์ ๊ฑฐ๋จ์ ๋ฐ๋ผ ์์ฃผ ์ฌํํด์ก๋ค!
์์ ๋งํ๋ฐ์ ๊ฐ์ด Property Wrapper
๋ก ์ธํด ๋ฐ๋ณต์ ์ธ ์์
์ด ์ ๊ฑฐ๋์๋ค.
๋จ์
๊ต์ฅํ ์ข์์๋ ๋จ์ ์ด ์กด์ฌํ๋ค.
๊ทธ๊ฒ์ nil
์ฒ๋ฆฌ๊ฐ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก๋ ์๋๋ค๋ ์ ์ด๋ค.
์์ ์ฝ๋ ์์์ ๊ฒฝ์ฐ json
์ isHidden
์ด๋ผ๋ ๊ฐ์ด ์กด์ฌํ๋ค.
ํ์ง๋ง, isHidden
์ด๋ผ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ, ๋ชจ๋ธ์ ํด๋น ๊ฐ์ ์ต์
๋์ฒ๋ฆฌ ํด์ฃผ๋๋ผ๋ ์ด ์ฝ๋๋ throw
ํ๊ฒ ๋๋ค.
๋ค์ ๋งํด ์ด๊ธฐํ๊ฐ ์๋๋ค!
์ค์ ๋ก ์๋ฒ์์๋ Request
์ ๋ฐ๋ผ Response
๊ฐ ๋ฌ๋ผ์ง ๊ฐ๋ฅ์ฑ์ ์กด์ฌํ๋ค.
๊ทธ๋ ๊ธฐ์ ์ด ๋จ์ ์ ์น๋ช ์ ์ด๋ผ ์๊ฐ๋๋ค.
ํ์ง๋ง, ์ด ๋จ์ ๋ํ ์ปค๋ฒ๊ฐ ๊ฐ๋ฅํ๋ค.
๊ทธ ํฌ์คํ ์ ๋ค์ํธ์~~