Ошибка при добавлении массива собственных объектов в 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