如何在Swift中将数组写入NSUserDefaults

时间:2014-12-11 21:43:11

标签: macos swift nsuserdefaults

我试图将数组的内容写入NSUserDefaults,但是当我以数组作为对象调用setObject:withKey时应用程序挂起。这是相关代码:

class Contact: NSObject {
    var name:String = ""
    var number:String = ""
}

var contacts:[Contact]?

contacts = [Contact]()

let contact = Contact()
contact.name = "Joe"
contact.number = "123-4567"
contacts.append(contact)

let defaults = NSUserDefaults.standardUserDefaults()
// Never returns from this when I step over it in the debugger
defaults.setObject(contacts, forKey: "contacts")
defaults.synchronize()

我做错了什么?

1 个答案:

答案 0 :(得分:2)

不确定它在OS X上究竟是如何工作的,但是如果它在iOS上有类似的东西,你就不能在NSUserDefaults中存储自定义类,只有字符串,Ints,数据等......所以一个解决方法是将您的数组转换为NSData,然后将其存储为数据,当您检索它时,将其转换为[Contact]。它可能看起来像这样:

    let data = NSKeyedArchiver.archivedDataWithRootObject(contacts)
    let defaults = NSUserDefaults.standardUserDefaults()
    // Storing the data
    defaults.setObject(data, forKey: "contacts")

    // Retrieving the data
    if let data = defaults.objectForKey("contacts") as? NSData {
        if let contacts = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [Contact] {
            // Now you have your contacts
        }
    }

但是,如果要存储大量数据,则应考虑采用其他形式的数据管理。