Arrays 在Swift中将多节点数组另存为用户默认值

Arrays 在Swift中将多节点数组另存为用户默认值,arrays,swift,Arrays,Swift,我有一个数组,似乎无法用Swift保存为用户默认值 var shoppingLists = [ (name: "Giant", items: ["Salad", "Bread"]), (name: "ShopRite", items: ["Chips", "Dip"]) ] NSUserDefaults.standardUserDefaults().setObject(shoppingLists, forKey: "GroceryList"); NSUserDefaults.st

我有一个数组,似乎无法用Swift保存为用户默认值

var shoppingLists = [
    (name: "Giant", items: ["Salad", "Bread"]),
    (name: "ShopRite", items: ["Chips", "Dip"])
]
NSUserDefaults.standardUserDefaults().setObject(shoppingLists, forKey: "GroceryList");
NSUserDefaults.standardUserDefaults().synchronize()

知道我做错了什么吗?如果我有一个简单的数组,比如var list=[1,2,3,4],我可以很好地保存它。但我似乎无法保存它目前的结构

这不是多维数组。这是一个元组数组。元组不符合
NSCoding
,因此不能将它们放入NSUserDefaults

您应该用实现
NSCoding
的简单类替换元组。然后可以使用
NSKeyedArchiver
将其序列化为
NSUserDefaults
。有关详细信息,请参阅

或者,您可以将其编码为字典数组:

var shoppingLists = [
    ["name": "Giant", "items": ["Salad", "Bread"]],
    ["name": "ShopRite", "items": ["Chips", "Dip"]]
]
这对存储来说并不坏,但我不会以这种方式处理数据。创建实际的模型类型几乎总是比依赖元组或字典更好


(旁注:几乎没有理由调用
synchronize()
。它只是暂停您的程序。它实际上不会导致写入任何内容。)

这不是多维数组。这是一个元组数组。元组不符合
NSCoding
,因此不能将它们放入NSUserDefaults

您应该用实现
NSCoding
的简单类替换元组。然后可以使用
NSKeyedArchiver
将其序列化为
NSUserDefaults
。有关详细信息,请参阅

或者,您可以将其编码为字典数组:

var shoppingLists = [
    ["name": "Giant", "items": ["Salad", "Bread"]],
    ["name": "ShopRite", "items": ["Chips", "Dip"]]
]
这对存储来说并不坏,但我不会以这种方式处理数据。创建实际的模型类型几乎总是比依赖元组或字典更好


(旁注:几乎没有理由调用
synchronize()
。它只是暂停您的程序。实际上不会导致写入任何内容。)

不要使用NSUserDefaults。相反,使用NsKeyedArchiver.tuple序列化数组,它们不应用于Apple iBook Swift中的数据结构:“元组对于相关值的临时组很有用。它们不适合创建复杂的数据结构。如果您的数据结构可能会超出临时范围,请将其建模为类或结构,而不是元组。”摘自:Apple Inc.“Swift编程语言(Swift 2预发布)。”不要使用NSUserDefaults。而是使用NsKeyedArchiver.Tuples序列化数组,它们不应用于Apple iBook Swift中的数据结构:“元组对于相关值的临时组很有用。它们不适合创建复杂的数据结构。如果您的数据结构可能会超出临时范围,请将其建模为类或结构,而不是元组。”摘自:Apple Inc.“Swift编程语言(Swift 2预发布)。”