ios - 将 [String] 存储在 NSUserDefaults 中

标签 ios swift string nsarray nsuserdefaults

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

稍后在代码中 (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()
    }
}

最佳答案

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

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"]
    }

}

但是,对于前面的代码,如果您设置 food = [],您将遇到一个问题,因为 food 不会返回 ["muesli", “香蕉”]。为了避免这种情况,您可能更喜欢以下代码:

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"]
    }

}

关于ios - 将 [String] 存储在 NSUserDefaults 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25420651/

相关文章:

ios - 在屏幕上固定标签

ios - 导航到另一个 ViewController 时,UITableView 行有问题

ios - 有两个选择的数组让我只完成了一半

ios - 使用 UIWebView 进行基本身份验证

java - 如何在 Java 中将字节编码为字符串

c - 为什么 strcpy 不能正常工作

iphone - 如何在 Objective C 中解析 JSON 格式

ios - 我需要使用 FCM 实现静默通知

ios - 呈现缓存的 View Controller 时 Swift 应用程序崩溃

javascript - 将字符串数组减少到最小的可正则表达式值