Swift:将一个对象数组和另一个对象数组保存到 NSUserDefaults 中
Posted
技术标签:
【中文标题】Swift:将一个对象数组和另一个对象数组保存到 NSUserDefaults 中【英文标题】:Swift: Save an Array of Objects with another Array of Objects inside into 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")
我对出了什么问题感到非常困惑,非常感谢任何帮助或指导!
【问题讨论】:
【参考方案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
,因为这对编译器来说是两个不同的东西。
解决方案
当您将 Question
和 UserEntry
逻辑移到符合 NSCoding
的 UserEntries
类中时,YourViewController
中也不再需要它。
所以,从YourViewController
中删除Question
和UserEntry
结构,这样UserEntries
中就只有一个Question
,事情应该(希望)再次正常工作。
希望对您有所帮助。
【讨论】:
谢谢!但是......它现在抛出 - 使用未解析的标识符“问题”,但我不是已经在课堂上声明了吗? @Anthony 是的,但在你的UserEntries
里面对吧?因此,它不再是 Question
,而是现在是 UserEntries.Question
,因为它是一个内部类。如果您认为这太令人困惑,您可以保留原来的Question
并使其符合NSCoding
,然后删除UserEntries.Question
。重要的是你在两个地方都使用了 same Question
类型。希望这是有道理的。
是的!谢谢!
不客气,很高兴你解决了这个问题。下一个问题吧:)
说到问题,回到原来的问题,用“unrecognized selector sent to instance”保存数组失败。我觉得这门课有问题。以上是关于Swift:将一个对象数组和另一个对象数组保存到 NSUserDefaults 中的主要内容,如果未能解决你的问题,请参考以下文章
iOS,Swift:如何保存包含自定义对象的数组以便我可以加载以供重用?
Swift - 使用 Codeable 保存对象崩溃应用程序