UserDefaults์ non-property list ์ค๋ฅ
UserDefaults๋ Float, Double, Int, URL ๋ฑ ๊ธฐ๋ณธ ํ์ ์ ๋ํ ํธ๋ฆฌํ ๋ฉ์๋๋ค์ ์ ๊ณตํ๋ค. ๊ฒ๋ค๊ฐ NSData, NSString, NSNumber, NSDate, NSArray, NSDictionary ํ์ ์ด๋ผ๋ฉด UserDefaults์ ์์ ๋กญ๊ฒ ์ ์ฅ ๋ฐ ๋ถ๋ฌ์ฌ ์ ์๋ค. ํ์ง๋ง ๊ฐ๋ฐ์ ํ ๋์๋ ๋ณดํต ์๋ ์์์ ๊ฐ์ด ์ปค์คํ ํ ํ์ ์ ์ฌ์ฉํ๋ค.
struct User {
let name: String
let age: String
}
์ด ์ปค์คํ ํ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด UserDefaults์ ์ ์ฅํด๋ณด์.
let user = User(name: "์ฌ์ฉ์", age: "12")
Userdeafaults.standard.setValue(user, forKey: "userSave")
์์ฝ๊ฒ๋ UserDefaults๋ NSData, NSString, NSNumber, NSDate, NSArray, NSDictionary ๋ฑ standard ํ์ ์ด ์๋๋ฉด ์ ์ฅํ๊ฑฐ๋ ๋ถ๋ฌ์ฌ ์ ์์ผ๋ฉฐ, ์๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
"Attempt to insert non-property list object ํ์ผ๋ช .User(~~) for key userSave "
์ฌ๊ธฐ์ Property list๋ ๊ฐ์ฒด ์ง๋ ฌํ๋ฅผ ์ํ ํ์ผ์ด๋ค. plist๋ผ๋ ํ์ฅ์๋ฅผ ๊ฐ์ง๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์๋ info.plist๊ฐ ๋ฐ๋ก property list์ด๋ค.
์ฆ ์์ ์ ์ค๋ฅ๋ ๊ฐ์ฒด ์ง๋ ฌํ ํ์ผ์ด ์๋ User ๊ฐ์ฒด๋ฅผ UserDefaults์ ์ ์ฅํ๋ ค ํด์ ๋ฐ์ํ ์ค๋ฅ์ด๋ค.
UserDefaults์ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ฉด, UserDefaults๋ property list ์ฌ์ผ ํ๋ค๊ณ ๋์์๋ค. ๊ทธ๋ฆฌ๊ณ Apple์ ๊ฐ๋ฐ์๊ฐ ์ปค์คํ ํ ํ์ ์ ๊ฐ์ฒด๋ฅผ UserDefaults์ ํ ๋นํ๊ณ ์ถ์ ๊ฒฝ์ฐ ๊ฐ์ฒด๋ฅผ NSData ํ์ ์ผ๋ก ๋ณํํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ์ฌ๊ธฐ์ NSData๋ property list ํ์ ์ค ํ๋์ด๋ค. ์ฐ๋ฆฌ๋ Object-C ๊ด๋ จํ ์ฝ๋๊ฐ ์์ผ๋ฏ๋ก Data ํ์ ์ผ๋ก ๋ณํํด๋ณด์.
default ๊ฐ์ฒด๋ NSData, NSString, NSNumber, NSDate, NSArray, NSDictionary์ ์ธ์คํด์ค์ ๊ฐ์ property list๊ฐ ๋์ด์ผํ๋ค. (๋๋ ์ปฌ๋ ์ ํ์ ์ธ ๊ฒฝ์ฐ ์ธ์คํด์ค์ ์กฐํฉ์ด์ด์ผ ํ๋ค.)
๋ง์ฝ ๋ค๋ฅธ ํ์ ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธธ ์ํ๋ค๋ฉด, ๊ฐ์ฒด๋ฅผ NSData ์ธ์คํด์ค๋ก ๋ง๋ค์ด ๋ณด๊ดํด์ผ ํ๋ค.
๋ค์ด๊ฐ๊ธฐ ์ Serializarion ๊ณต๋ถํ๊ธฐ
์ปค์คํ ๊ฐ์ฒด๋ฅผ Serializarionํ๊ธฐ
์ด์ ๊ด๋ จํ Apple์ ๊ณต์๋ฌธ์ Archives and Serialization ๋ฅผ ๋ณด๋ฉด, serializarion์ ํ๊ธฐ ์ํด์๋ Encoder์ Decoder API๋ค์ ์ฌ์ฉํ๋ผ๊ณ ๋์์๋ค.
์ฑ์ ๋ฉ๋ชจ๋ฆฌ ๋ด ํ์ ์ ์ ์ถ๋ ฅ๊ณผ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ํตํ ์ง๋ ฌํ(Serialization) ๋๋ ์ฅ๊ธฐ๊ฐ์ ์ ์ฅ์ ์ ํฉํ ํํ์ผ๋ก ๋ณํํ๊ธฐ ์ํด ์ด API๋ค์ ์ฌ์ฉํ๋ผ.
Swift์์, standard ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Encodable, Decodable๊ณผ Codable ํ์ ๋ค(Int, String ๋ฑ)์ ์ ์ํ๊ณ , ๋ง๋ถ์ฌ 'Encoding, Decoding, and Serialization'์์ ์ค๋ช ๋์ด์๋ฏ์ด encoding๊ณผ decoding์ ์ํํ๋ Encoder์ Decoder APIs๋ฅผ ์ ์ํ๋ค.
๊ทธ๋ผ ์ปค์คํ ๊ฐ์ฒด์ Encoder, Decoder๋ฅผ ์ฌ์ฉํด ๋ฐ๋ก Serialization์ ํ ์ ์์๊น? ์์ฝ์ง๋ง ์ปค์คํ ํ์ ๋ standard ํ์ ๋ค๊ณผ ๋ค๋ฅด๊ฒ Codableํ์ง ์๋ค. ๋ฐ๋ผ์ ์ ์ธ๋ถ์ ์์ ๋ชฉ๋ก์ Codable์ ์ฑํํด์ค์ผ๋ก์จ Codableํ๊ฒ ๋ง๋ค์ด์ฃผ์. ๋ง์ฝ decoding์ด ํ์์๋ ์ปค์คํ ํ์ ๋ผ๋ฉด Encodable์, encoding์ด ํ์์๋ ์ปค์คํ ํ์ ์ด๋ผ๋ฉด Decodable์ ๋ช ์ํ์. Apple์ ๊ณต์๋ฌธ์์ธ Encoding and Decoding Custom Types ๋ฅผ ๋ณด๋ฉด ์์๊ฐ ์ ๋์์๋ค.
struct Coordinate: Codable {
var latitude: Double
var longitude: Double
}
struct Landmark: Codable {
// Double, String, and Int all conform to Codable.
var name: String
var foundingYear: Int
// Adding a property of a custom Codable type maintains overall Codable conformance.
var location: Coordinate
}
์ปค์คํ ํ์ ์ด ์ด์ Codableํ๋ Endcoder๋ฅผ ํตํด ์ปค์คํ ๊ฐ์ฒด๋ฅผ Data ํ์ ์ผ๋ก ๋ณํํ ์ฐจ๋ก์ด๋ค. Encoder ํ๋กํ ์ฝ์ ์ค์ํ๋ class ์ค PropertyListEncoder๊ฐ ์๋ค. ์๋์ encode ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด Data ํ์ ์ ๋ฐํ๋ฐ์ ์ ์๋ค. ๋ง์ฝ JSON ํ์ ์ ์ฌ์ฉํ๋ ๋คํธ์ํฌ ํต์ ์ ํ ๊ณํ์ด๋ผ๋ฉด JSONEncoder๋ฅผ ํตํด Serializarion ํด์ค ์๋ ์๋ค.
func encode<Value>(_ value: Value) throws -> Data where Value : Encodable
์ปค์คํ ๊ฐ์ฒด๋ฅผ Serializionํด UserDefaults์ ์ ์ฅํ๊ณ ๊บผ๋ด์ค๊ธฐ ์์
struct MessageModel: Codable {
let text: String
}
let message = MessageModel(text: "์ ์ฅํ๊ธฐ ๋ฒํผ์ ๋๋ ์ต๋๋ค.")
let userDefault = UserDefaults.standard
//UserDefaults์ ์ ์ฅํ๊ธฐ
let pEncoder = PropertyListEncoder()
let encodedData = try? pEncoder.encode(message)
userDefault.set(encodedData, forKey: "BlogTestEx_PropertyListEncoder")
//UserDefaults์์ ๊บผ๋ด์ค๊ธฐ
let userData = userDefault.object(forKey: "BlogTestEx_PropertyListEncoder")
guard let object = userData as? Data else { return }
let pDecoder = PropertyListDecoder()
let decodedData = try? pDecoder.decode(MessageModel.self, from: object)
if let message = decodedData {
self.textLabel.text = message.text
}
'iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ iOS ] CollectionView์ Section ์จ๊ธฐ๊ธฐ - CompositionalLayout (0) | 2023.03.06 |
---|---|
[ iOS ] ScrollView ํ๋ฉด ์บก์ณํ๊ธฐ (Image Creation) (0) | 2023.02.18 |
[ iOS ] Property list (0) | 2023.01.20 |
[ iOS ] ๊ณต์ ํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ - UIActivityViewController (0) | 2023.01.03 |
[ iOS ] UIListContentConfiguration: CollectionView์ ๊ธฐ๋ณธ Cell ์ฌ์ฉํ๊ธฐ (14+) (0) | 2022.12.04 |