Не удается сохранить массив пользовательских классов в UserDefaults - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь сохранить массив пользовательских классов в UserDefaults, но он не работает.Я вернул ноль на if let.Я везде смотрел онлайн.Я использую Swift 4.2

extension UserDefaults {
    func saveReciters(_ reciters: [Reciter]) {
        do {
            let encodedData = try NSKeyedArchiver.archivedData(withRootObject: reciters, requiringSecureCoding: false)
            self.set(encodedData, forKey: UD_RECITERS)
        } catch {
            debugPrint(error)
            return
        }
    }

    func getReciters() -> [Reciter] {
        if let reciters = self.object(forKey: UD_RECITERS) as? Data {
            return NSKeyedUnarchiver.unarchiveObject(with: reciters) as! [Reciter]
        } else {
            print("EMPTY RECITERS")
            return [Reciter]()
        }
    }
}

UserInfo = {NSDebugDescription = Пойманная исключительная ситуация во время архивирования: - [_ SwiftValue encodeWithCoder:]: нераспознанный селектор, отправленный на экземпляр 0x600001babcc0

Вот мой класс:

class Reciter: NSCoding {

private(set) public var name: String
private(set) public var image: UIImage?
private(set) public var surahs: [Surah]
private(set) public var documentID: String

private let quranData = QuranData()

init(name: String, image: UIImage?, surahCount: Int?, documentID: String) {
    self.name = name
    self.image = image
    self.documentID = documentID

    if let surahCount = surahCount {
        surahs = Array(quranData.getAllSurahs().prefix(surahCount))
    } else {
        surahs = quranData.getAllSurahs()
    }
}

func encode(with aCoder: NSCoder) {

}

required init?(coder aDecoder: NSCoder) {

}
}

В моем классе Суры я получаю ноль обратно.Все остальные свойства я возвращаю успешно enter image description here

1 Ответ

0 голосов
/ 03 марта 2019

Чаще всего я вижу использование разработчиком codeable, здесь я использую пользователя в качестве примера:

YourDataModel.swift

struct User: Codable {
    var userId: String = ""
    var name: String = ""
    var profileImageData: Data? }

UserDefaults.swift

import Foundation

extension UserDefaults {

    /// The current user of the application, see `./Models/User.swift`
    var currentUser: User? {
        get {
            guard let userData = self.object(forKey: #function) as? Data else { return nil }
            return try? JSONDecoder().decode(User.self, from: userData)
        }

        set {
            guard let newuser = newValue else { return }
            if let userData = try? JSONEncoder().encode(newuser) {
                self.set(userData, forKey: #function)
            }
        }
    }

}

Преобразовать данные в данные json ... #function - это имя функции или значения, например

    // For the case the user doesn't yet exist.
    if ( UserDefaults.standard.currentUser == nil )  {
        // Create a new user
        user = User()
        // Generate an id for the user, using a uuid.
        user?.userId = UUID().uuidString
    } else {
        // otherwise, fetch the user from user defaults.
        user = UserDefaults.standard.currentUser
    }
...