Ошибка при добавлении массива собственных объектов в UserDefaults в Swift 3.1

К сожалению, я не могу добавить список своих объектов класса в UserDefaults, Следующая ошибка генерируется:

NSForwarding: предупреждение: объект 0x6080002502c0 класса 'ClrLearn.highscoreStructure' не реализует methodSignatureForSelector: - проблема впереди Нераспознанный селектор -[ClrLearn.highscoreStructure >replaceObjectForKeyedArchiver:]

Класс выглядит следующим образом (он был изменен в соответствии с различными темами в стеке, например, один - как хранить пользовательские объекты в NSUserDefaults):

class highscoreStructure {
    var name : String = ""
    var score : Int = 0

    init(name: String, score: Int) {
        self.name = name
        self.score = score
    }

    required init(coder decoder: NSCoder) {
        self.name = decoder.decodeObject(forKey: "name") as? String ?? ""
        self.score = decoder.decodeInteger(forKey: "score")
    }

    func encode(with coder: NSCoder) {
        coder.encode(name, forKey: "name")
        coder.encode(score, forKey: "score")
    }
}

Хорошо, похоже, что я сделал что-то не так с правилами стека, так что извините, Рмадди - это был первый и последний раз, я обещаю.:)

Но, возвращаясь к проблеме, первая часть была решена vadian - большое спасибо! Но все же эта часть моего приложения не работает: я установил rootObject (NSKeyedArchiver.archivedData(withRootObject: highscoreStructObjects)) в качестве массива объектов (такая глупая ошибка!), Но все еще есть ошибки, подобные этой:

[ClrLearn.HighscoreStructure encodeWithCoder:]: нераспознанный селектор отправлен> в экземпляр 0x6080002586c0

или же

Завершение работы приложения из-за невыполненной исключительной ситуации NSInvalidArgumentException, > причина: '-[ClrLearn.HighscoreStructure >encodeWithCoder:]: нераспознанный> селектор, отправленный экземпляру>0x6080002586c0' -

Ps. Я не уверен, что это место, где я должен ошибаться - журнал отладки мне до сих пор не совсем понятен, по крайней мере, не так чист, как в Visual Studio.:) Может мне стоит вставить что-то другое?

Pps. Эта строка кода выглядит следующим образом:

let encodedData = NSKeyedArchiver.archivedData(withRootObject:     highscoreStructObjects)
UserDefaults.standard.set(encodedData, forKey: "highscores")

2 ответа

Решение

Хорошо, я надеюсь, что в этот раз я не ошибусь - проблема была решена rmaddy в другой "теме", но vadian был очень, но очень близок - для реализации NSCoding мне нужно наследовать от NSObject, как он писал, но также от... NSCoding! Разве это не очевидно? Для меня это не было... С другой стороны, возможно, он пытался сказать мне, что я должен унаследовать от обоих, но мой английский был слишком плох, чтобы получить его. В любом случае, я нашел ответ, так что спасибо большое Vadian, Rmaddy и еще раз извините за нарушение некоторых правил SOF... Это было в первый и последний раз! Ох, и есть поток, когда я наконец-то нашел ответ, и да, я был слеп, что я пропустил его раньше - encodeWithCoder: нераспознанный селектор отправлен на экземпляр

Чтобы иметь возможность реализовать NSCoding класс должен наследовать от NSObject,

class HighscoreStructure : NSObject { ...

Кстати, имена классов должны начинаться с заглавной буквы.

А также decodeObject(forKey: "name") никогда не может быть nil ты можешь смело писать

self.name = decoder.decodeObject(forKey: "name") as! String
Другие вопросы по тегам