Junior
User Defaults колдонуп маалыматтардын түзүмүн сактап жана окуу кандай?
sobes.tech AI
AIден жооп
User Defaults гана чектелген түрлөрдүн топтомун сактайт: Data, String, Number, Date, Array, Dictionary. Өзгөчө түзүмдөрдү сактоо үчүн аларды Dataке коддоо жана кайра декоддоо керек.
Codable протоколу колдонулат (Encodable жана Decodable бирикмеси).
-
Түзүмдү аныктоо: Түзүм
Codableпротоколуна ылайык болушу керек.struct MyData: Codable { let id: Int let name: String let isActive: Bool } -
Сактоо: Түзүмдү
Dataке коддоо жана User Defaultsке сактоо.let myStruct = MyData(id: 1, name: "Example", isActive: true) // Коддоо let encoder = JSONEncoder() if let encodedData = try? encoder.encode(myStruct) { // сактоо UserDefaults.standard.set(encodedData, forKey: "myCustomData") } else { // ката аныктоо print("Failed to encode struct") } -
Окуу: User Defaultsтен Data алуу жана кайра структурага декоддоо.
if let savedData = UserDefaults.standard.data(forKey: "myCustomData") { let decoder = JSONDecoder() if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) { print("Loaded struct: \(loadedStruct)") } else { print("Failed to decode data") } } else { print("No data found for key") }
Негизги учурлар:
- User Defaults чоң көлөмдөгү маалыматтарды же сырдуу маалыматтарды сактоо үчүн арналган эмес.
CodableжанаJSONEncoder/JSONDecoderколдонуу — өзгөчө типтерди сактоо үчүн стандарттык ыкма.try?колдонуп, ката кетсе аны иштетүү керек.- Масивдерди сактоо да
Codableаркылуу жүргүзүлөт.
// Масив түзүмдөрдү сактоо мисалы
let dataArray: [MyData] = [
MyData(id: 1, name: "A", isActive: true),
MyData(id: 2, name: "B", isActive: false)
]
let encoder = JSONEncoder()
if let encodedArrayData = try? encoder.encode(dataArray) {
UserDefaults.standard.set(encodedArrayData, forKey: "myCustomArray")
}
// Масив түзүмдөрдү окуу мисалы
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
let decoder = JSONDecoder()
if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
print("Loaded array: \(loadedArray)")
}
}