如何在Swift中的NSUserDefault中存储Array?

时间:2016-05-02 06:18:59

标签: ios iphone swift nsuserdefaults

所以我已经尝试了几个小时来将一个数组存储到NSUserDefault并将它们打印到单元格,但数据没有保存为数组,它基本上只保存一个值。

var emailData = [String]()
    var passwordData = [String]()

@IBAction func addPressed(sender: AnyObject) {

 let defaults = NSUserDefaults.standardUserDefaults()

    emailData.append(addEmail.text!)
    passwordData.append(addPassword.text!)

var storedEmail = defaults.objectForKey("emailData") as? [String] ?? [String]()
var storedPasswords = defaults.objectForKey("passwordData") as? [String] ?? [String]()


// then update whats in the `NSUserDefault`
    defaults.setObject(emailData, forKey: "emailData")
    defaults.setObject(passwordData, forKey: "passwordData")


// call this after you update
defaults.synchronize()        /*

 NSUserDefaults.standardUserDefaults().setValue(addEmail.text, forKey: "email")
 NSUserDefaults.standardUserDefaults().synchronize()
     */


}

所以基本上数据没有保存。

4 个答案:

答案 0 :(得分:4)

您也可以通过这种方式存储数组

let userDefault = NSUserDefaults.standardUserDefaults()
let arr = ["abc","xyz","pqr"]
userDefault.setObject(arr, forKey: "arr")
userDefault.synchronize()

let data = userDefault.objectForKey("arr") as! [String]

答案 1 :(得分:3)

可以在NSUserDefaults中存储数组。但是在单独的阵列中分离电子邮件和密码是不合适的。您应该将它存储为一个对象,因为它们是相关的。

在你的情况下,一个Dictionary对象数组更好,也可以存储在NSUserDefaults中,你可以将它作为一个Dictionary数组检索。

以下是样本:

    let userDefault = NSUserDefaults.standardUserDefaults()

    var storedCredentials = userDefault.objectForKey("credentials") as? [[String:AnyObject]] ?? [[String:AnyObject]]()

    let email =
    [
        "email" : addEmail.text!,
        "password": addPassword.text!
    ]

    storedCredentials.append(email)

    userDefault.setObject(storedCredentials, forKey: "credentials")
    userDefault.synchronize()

答案 2 :(得分:3)

在Swift中保存Swift数组。

let kUserDefault = NSUserDefaults.standardUserDefaults()
kUserDefault.setObject(["KIRIT" , "MODI" , "FIRST" , "LAST"], forKey: "nameArray")
kUserDefault.synchronize()

获取数组

<强> 1。 arrayForKey:你得到Swift数组

kUserDefault.arrayForKey("nameArray")!

<强> 2。 objectForKey:你得到了NSArray

kUserDefault.objectForKey("nameArray")!

第3。 valueForKey:你得到了NSArray

kUserDefault.valueForKey("nameArray")

答案 3 :(得分:0)

如果查看documentation,则无法在NSUserDefault中保存[String]数组:

  

对于NSArray和NSDictionary对象,其内容必须是属性   列出对象。

您可以做的是将[String]转换为NSData,然后将其保存到NSUserDefault。

// Store it as NSData
var emailData = [String]()
emailData.append("email1")
emailData.append("email2")
let emailIntoNSData = NSKeyedArchiver.archivedDataWithRootObject(emailData)
NSUserDefaults.standardUserDefaults().setObject(emailIntoNSData, forKey: "emailData")

// Retrieve it : 
let emailFromNSData = NSUserDefaults.standardUserDefaults().objectForKey("emailData") as? NSData
if let emailFromNSData = emailFromNSData {
let emailArray = NSKeyedUnarchiver.unarchiveObjectWithData(emailFromNSData) as? [String]
     if let emailArray = emailArray {
           NSLog("Email Data : \(emailArray)") // ["email1","email2"]
           // do something…
      }
 }