ios 在 NSUserDefaults 中存储 [String]

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25420651/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 01:58:31  来源:igfitidea点击:

Store [String] in NSUserDefaults

iosswiftstringnsarraynsuserdefaults

提问by Thomas

I want to save a Swift Style String Array into NSUserDefaults, but acutally the "if" statement in the code says that returnValue is always nil.

我想将 Swift 样式字符串数组保存到 NSUserDefaults 中,但实际上代码中的“if”语句表示 returnValue 始终为零。

Later in the code (iOS 8) I want to use "food += ["spaghetti"] to add new entries.

稍后在代码(iOS 8)中,我想使用 "food += ["spaghetti"] 添加新条目。

var food : [String] {
    get {
        var returnValue : [String]? = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String]
        if returnValue == nil      //Check for first run of app
        {
            returnValue = ["muesli", "banana"]; //Default value
        }
        return returnValue!
    }
    set (newValue) {
        NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food")
        NSUserDefaults.standardUserDefaults().synchronize()
    }
}

采纳答案by Imanou Petit

The following code should help you resolve your problem:

以下代码应该可以帮助您解决问题:

import UIKit

class ViewController: UIViewController {

    var food: [String] {
        get {
            if let returnValue = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String] {
                return returnValue
            } else {
                return ["muesli", "banana"] //Default value
            }
        }
        set {
            NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        print(food) // prints: ["muesli", "banana"] (at first launch)

        food = ["cake"]
        print(food) // prints: ["cake"]

        food += ["spaghetti"]
        print(food) // prints: ["cake", "spaghetti"]

        food = []
        print(food) // prints: []

        NSUserDefaults.standardUserDefaults().setObject(nil, forKey: "food")
        print(food) // prints: ["muesli", "banana"]
    }

}


However, with the previous code, if you set food = [], you will have a problem as foodwon't return ["muesli", "banana"]. In order to avoid this, you may prefer the following code:

但是,在前面的代码中,如果设置了food = [],则会出现food不会返回的问题["muesli", "banana"]。为了避免这种情况,您可能更喜欢以下代码:

import UIKit

class ViewController: UIViewController {

    var food: [String] {
        get {
            if let returnValue = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String] {
                return returnValue == [] ? ["muesli", "banana"] : returnValue
            } else {
                return ["muesli", "banana"] //Default value
            }
        }
        set {
            NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        print(food) // prints: ["muesli", "banana"] (at first launch)

        food = ["cake"]
        print(food) // prints: ["cake"]

        food += ["spaghetti"]
        print(food) // prints: ["cake", "spaghetti"]

        food = []
        print(food) // prints: ["muesli", "banana"]

        NSUserDefaults.standardUserDefaults().setObject(nil, forKey: "food")
        print(food) // prints: ["muesli", "banana"]
    }

}

回答by pNre

As stated in the documentation:

文档中所述:

For NSArray and NSDictionary objects, their contents must be property list objects.

对于 NSArray 和 NSDictionary 对象,它们的内容必须是属性列表对象。

This means you need to convert your Stringobjects to NSStringwhen saving, something like this should work:

这意味着您需要在保存时将String对象转换为NSString,这样的事情应该可以工作:

var food : [String] {
    get {
        var returnValue : [String]? = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String]
        if returnValue == nil      //Check for first run of app
        {
            returnValue = ["muesli", "banana"]; //Default value
        }
        return returnValue!
    }
    set (newValue) {
        //  Each item in newValue is now a NSString
        let val = newValue as [NSString]
        NSUserDefaults.standardUserDefaults().setObject(val, forKey: "food")
        NSUserDefaults.standardUserDefaults().synchronize()
    }
}

回答by Sina

In Swift 3.0

在 Swift 3.0 中

Store

店铺

UserDefaults.standard.set(newValue, forKey: "yourkey")
UserDefaults.standard.synchronize()

Retrieve

取回

var returnValue: [NSString]? = UserDefaults.standard.object(forKey: "yourkey") as? [NSString]

Remove

消除

UserDefaults.standard.removeObject(forKey: "yourkey")

Reference: NSUserdefault objectTypes

参考:NSUserdefault objectTypes

回答by PSS

Set and Get NSUserDefault with function

使用函数设置和获取 NSUserDefault

Use below function to globally use , declare in any class any use in whole app

使用下面的函数全局使用,在任何类中声明在整个应用程序中的任何使用

Declaration

Declaratioñ

func setUserDefault(ObjectToSave : AnyObject?  , KeyToSave : String)
{
    let defaults = NSUserDefaults.standardUserDefaults()

    if (ObjectToSave != nil)
    {

        defaults.setObject(ObjectToSave, forKey: KeyToSave)
    }

    NSUserDefaults.standardUserDefaults().synchronize()
}

func getUserDefault(KeyToReturnValye : String) -> AnyObject?
{
    let defaults = NSUserDefaults.standardUserDefaults()

    if let name = defaults.valueForKey(KeyToReturnValye)
    {
        return name
    }
    return nil
}

How to call

如何打电话

Classname_where_this_function_declare.sharedInstance.setUserDefault("value", KeyToSave: "key")**  

回答by Nikunj Patel

//

//

    class func saveCustomObject(_ object: AnyObject?, key: String) { 
      let encodedObject = NSKeyedArchiver.archivedData(withRootObject: object!) 
      let userDefaults = UserDefaults.standard userDefaults.set(encodedObject, forKey: key) 
      userDefaults.synchronize() 
    } 

//

//

class func loadCustomObject(_ key: String) -> AnyObject? { 
   let userDefaults = UserDefaults.standard 
   if let userDefaultKey = userDefaults.object(forKey: key) { 
     let encodedObject = userDefaultKey as! NSData 
     return NSKeyedUnarchiver.unarchiveObject(with: encodedObject as Data)! as AnyObject? 
   } else {
     return nil 
   }
} 

//

//

class func removeCustomObject(_ key: String) { // 
    let encodedObject = NSKeyedArchiver.archivedDataWithRootObject(object!) let userDefaults = 
    UserDefaults.standard userDefaults.removeObject(forKey: key) 
    userDefaults.synchronize()
 }


call Method

调用方法

let aParams : [String : String] = [ "DeviceType" : "iOS", ]
CommonMethods.saveCustomObject(aParams as AnyObject?, key:Constants.kLoginData)