如何在Swift的NSUserDefault中存储Array?

所以我已经尝试了几个小时的方法来将数组存储到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() */ } 

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

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

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

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

在你的情况下,一个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() 

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

如果查看文档 ,则无法在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… } }