Разкажете за кодиране и декодиране на данни в UserDefaults.
sobes.tech AI
Отговор от AI
UserDefaults съхранява данни във формат ключ-стойност. За потребителски типове данни, които не се поддържат директно (String, Int, Bool, Data, Array, Dictionary), е необходима кодиране/декодиране. Използва се протоколът Codable, който обединява Encodable и Decodable.
Пример за кодиране на потребителски тип:
struct User: Codable {
let name: String
let age: Int
}
let user = User(name: "Иван", age: 30)
С помощта на PropertyListEncoder и PropertyListDecoder може да се кодира/декодира обекти Codable в Data за съхранение в UserDefaults.
Кодиране:
let encoder = PropertyListEncoder()
if let encoded = try? encoder.encode(user) {
UserDefaults.standard.set(encoded, forKey: "currentUser")
}
Декодиране:
if let savedData = UserDefaults.standard.data(forKey: "currentUser") {
let decoder = PropertyListDecoder()
if let loadedUser = try? decoder.decode(User.self, from: savedData) {
print("Зареден потребител: \(loadedUser.name), възраст: \(loadedUser.age)")
}
}
Алтернативен начин (по-малко препоръчителен за нови проекти): използване на NSCoding с наследяване от NSObject.
Сравнение на методите:
| Метод | Протокол/Клас | Поддръжка за стойностни/референтни типове | Необходими методи | Леснота |
|---|---|---|---|---|
Codable |
Codable (Encodable, Decodable) |
Стойност и референтен | Автоматична реализация при изпълнение на условията | Висока |
NSCoding |
NSCoding |
Референция (изисква NSObject) |
init(coder:), encode(with:) |
Средна |
Codable е съвременният и препоръчителен подход поради простотата на използване и автоматичната синтеза. NSCoding може да е необходим за поддръжка на стария код.