Sobes.tech
Junior

Разкажете за кодиране и декодиране на данни в 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 може да е необходим за поддръжка на стария код.