Swift: сохранить массив объектов с другим массивом объектов внутри в NSUserDefaults - PullRequest
0 голосов
/ 01 сентября 2018

Я работал над моим первым приложением, но сейчас мне нужно сохранить данные пользователей, но не могу. У меня есть массив объектов, с массивом объектов «Вопросы» внутри:

struct Question {
    let question: String
    let answer: String
}

struct UserEntry {
    let date: String
    let questions: [Question]
}

let userEntry = [UserEntries(date: todayDate, questions: [Question(answer: mood), Question(question: q1Text, answer: q1Answer), Question(question: q2Text, answer: q2Answer)])]

Но возникает ошибка: невозможно преобразовать значение типа «ThisViewController.Question» в ожидаемый тип элемента «UserEntries.Question». После следующего ответа стека также создали для него класс:

class UserEntries: NSObject, NSCoding {
struct Question {
    var question: String
    var answer: String
}

var date: String
var questions: [Question]

init(date: String, questions: [Question]) {
    self.date = date
    self.questions = questions
}

required convenience init(coder aDecoder: NSCoder) {
    let date = aDecoder.decodeObject(forKey: "date") as! String
    let question = aDecoder.decodeObject(forKey: "questions")
    self.init(date: date, questions: question as! [UserEntries.Question])
}

func encode(with aCoder: NSCoder) {
    aCoder.encode(date, forKey: "date")
    aCoder.encode(questions, forKey: "questions")
}
}

Я сохраняю данные примерно так:

let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: userEntry)
UserDefaults.standard.set(encodedData, forKey: "allEntries")

Я очень смущен тем, что не так, любая помощь или руководство очень ценятся!

1 Ответ

0 голосов
/ 01 сентября 2018

Ваша проблема в том, что вы создали объект Question в двух местах.

Посмотрите на сообщение об ошибке:

Невозможно преобразовать значение типа 'ThisViewController.Question' в ожидаемый тип элемента 'UserEntries.Question'.

Теперь посмотрите на код, который вы указали. Сначала я думаю, что это YourViewController:

struct Question {
    let question: String
    let answer: String
}

struct UserEntry {
    let date: String
    let questions: [Question]
}

let userEntry = [UserEntries(date: todayDate, questions: [Question(answer: mood), Question(question: q1Text, answer: q1Answer), Question(question: q2Text, answer: q2Answer)])]

А потом:

class UserEntries: NSObject, NSCoding {
struct Question {
    var question: String
    var answer: String
}
...

Итак ... У вас есть Question, определенный в вашем ThisViewController, а затем у вас есть еще один Question, определенный в вашем UserEntries классе.

Компилятор говорит вам, что он думал, что вы используете ThisViewController.Question, который вы не можете добавить к UserEntries.Question, поскольку это две разные вещи для компилятора.

Решение

Поскольку вы переместили свою логику Question и UserEntry в класс UserEntries, который соответствует NSCoding, она вам больше не нужна и в YourViewController.

Итак, удалите структуры Question и UserEntry из вашего YourViewController, чтобы у вас было только Question в UserEntries, и все должно (надеюсь) сработать снова.

Надеюсь, это поможет.

...