Не удается сохранить данные из пользовательских классов с помощью UserDefaults. Это другое. У меня есть 2 класса.

Этот вопрос отличается от - Сохранение пользовательского класса SWIFT с NSCoding в UserDefaults и это отличается, потому что есть 2 класса, которые связаны друг с другом, и я не знаю, как реализовать NSCoding для них обоих. Я новичок, и я пытался решить эту проблему более 6 часов. . И, кстати, это не дубликат, потому что все решения здесь устарели. У меня есть 2 основных пользовательских класса (суперкласс и подкласс) в моем приложении, и с помощью UserDefaults я хочу сделать так, чтобы я мог постоянно сохранять данные.

Первый класс:

class Day { 
    var dayName: String
    var subjects: [Subject]?
    init(dayName: String) {
       self.dayName = dayName
    }
}

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

class Subject: Day {
    var subjectName: String
    var startsAt: String?
    init(dayName: String,subjectName: String) {
       self.subjectName = subjectName
       super.init(dayName: dayName)
    }    
}

Я пытаюсь сохранить экземпляр класса Subject следующим образом:

UserDefaults.standard.set(Subject(dayName: "Monday",subjectName: "Programming"), forKey: "subject")
    let savedSubject = UserDefaults.standard.object(forKey: "subject") as? Subject
    print(savedSubject!.subjectName)

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

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Попытка вставить объект списка, не относящийся к свойствам School_Class_Scedule.Subject для ключевой темы»

Я провел много исследований и обнаружил, что мне следует преобразовать объект в NSData, но я не знаю, как это сделать с помощью swift 3 или 4 в XCode 9. Буду очень признателен за любую помощь. Спасибо, что спасли мне жизнь и помогли осуществить мою мечту.


person IOS developer    schedule 02.12.2017    source источник
comment
Это является дубликатом. Что не так с вашим предыдущим вопросом?   -  person vadian    schedule 03.12.2017
comment
Возможный дубликат Сохранение пользовательского класса SWIFT с NSCoding в UserDefaults   -  person vadian    schedule 03.12.2017
comment
Нет ничего плохого, просто подумал, что я как бы решил эту проблему, а потом я получил эту проблему и знаю, что пытаюсь ее решить. Помогите мне, если можете   -  person IOS developer    schedule 03.12.2017
comment
Обязательно используйте NSCoding, если вы собираетесь сохранить пользовательский класс в UserDefaults, если только все свойства не являются списком свойств или совместимы с JSON, тогда вы также можете использовать соответствующую сериализацию (в Swift 4 даже Codable).   -  person vadian    schedule 03.12.2017
comment
Итак, я не могу сохранить все данные, например экземпляры Subject, только с UserDefaults и без реализации NSCoding?   -  person IOS developer    schedule 03.12.2017
comment
Нет, ты не можешь. На самом деле вы можете использовать упомянутые альтернативы, если классы совместимы с JSON или списком свойств.   -  person vadian    schedule 03.12.2017
comment
Это последняя большая проблема, с которой я столкнулся перед тем, как отправить приложение в магазин приложений, поэтому не могли бы вы написать код о том, как я могу реализовать NSCoding в своем коде, и привести пример?   -  person IOS developer    schedule 03.12.2017
comment
Ты серьезно? В моем ответе на ваш предыдущий вопрос была включена реализация NSCoding.   -  person vadian    schedule 03.12.2017
comment
Хорошо, спасибо, я только что понял, что с этим я могу конвертировать данные в NSData, как показано в этом примере (stackoverflow.com/questions/26469457/) и, наконец, сохранить данные навсегда?   -  person IOS developer    schedule 03.12.2017