【问题标题】:Swift: Save an Array of Objects with another Array of Objects inside into NSUserDefaultsSwift:将一个对象数组和另一个对象数组保存到 NSUserDefaults 中
【发布时间】:2018-09-01 07:48:27
【问题描述】:

我一直在使用我的第一个应用程序,但现在我需要保存用户数据,但不能。我有一个对象数组,里面还有一个“问题”对象数组:

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")

我对出了什么问题感到非常困惑,非常感谢任何帮助或指导!

【问题讨论】:

    标签: ios swift object nsuserdefaults


    【解决方案1】:

    您的问题是您在两个地方创建了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
    }
    ...
    

    所以...您在ThisViewController 中定义了Question,然后在UserEntries 类中定义了另一个Question

    编译器告诉您它认为您正在使用ThisViewController.Question,您不能将其添加到UserEntries.Question,因为这对编译器来说是两个不同的东西。

    解决方案

    当您将 QuestionUserEntry 逻辑移到符合 NSCodingUserEntries 类中时,YourViewController 中也不再需要它。

    所以,从YourViewController 中删除QuestionUserEntry 结构,这样UserEntries 中就只有一个Question,事情应该(希望)再次正常工作。

    希望对您有所帮助。

    【讨论】:

    • 谢谢!但是......它现在抛出 - 使用未解析的标识符“问题”,但我不是已经在课堂上声明了吗?
    • @Anthony 是的,但在你的UserEntries 里面对吧?因此,它不再是 Question,而是现在是 UserEntries.Question,因为它是一个内部类。如果您认为这太令人困惑,您可以保留原来的Question 并使其符合NSCoding,然后删除UserEntries.Question。重要的是你在两个地方都使用了 same Question 类型。希望这是有道理的。
    • 是的!谢谢!
    • 不客气,很高兴你解决了这个问题。下一个问题吧:)
    • 说到问题,回到原来的问题,用“unrecognized selector sent to instance”保存数组失败。我觉得这门课有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2021-04-29
    • 2018-03-12
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2018-02-05
    相关资源
    最近更新 更多