【问题标题】:Store [String] in NSUserDefaults在 NSUserDefaults 中存储 [String]
【发布时间】:2014-10-14 18:02:08
【问题描述】:

我想将 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()
    }
}

【问题讨论】:

  • 我也尝试了这个link 的几件事,但它没有提出解决方案
  • 看来您的问题是您永远不会将这些值保存到用户默认值中,因为向数组中添加新项目不会调用设置器。您需要在某处直接设置实际的food(例如food = ["such", "and", "such"])才能将其保存。
  • 我刚刚在最新的 Xcode7 和 Swift2.0 中尝试过你的代码,它实际上是完美的。
  • 这是 NSUserDefault 的最佳示例:iosdevcenters.blogspot.com/2016/05/…

标签: ios swift string nsarray nsuserdefaults


【解决方案1】:

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

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

}

【讨论】:

  • 很好奇,为什么要将食物声明为 [NSString] 而不是 [String]?可以转换为 [NSString] 存储在 NSUserDefaults 中,然后从 NSUserDefaults 返回时返回 [String]。
【解决方案2】:

documentation中所述:

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

这意味着您需要在保存时将 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()
    }
}

【讨论】:

  • 似乎这是最好的,因为您只是转换为 [NSString] 进行存储,同时从存储返回 [String]。
【解决方案3】:

在 Swift 3.0 中

商店

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

检索

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

删除

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

参考:NSUserdefault objectTypes

【讨论】:

    【解决方案4】:

    使用函数设置和获取 NSUserDefault

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

    声明n

    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
    }
    

    如何拨打电话

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

    【讨论】:

      【解决方案5】:

      //

          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()
       }
      

      调用方法

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-17
        • 1970-01-01
        • 1970-01-01
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        相关资源
        最近更新 更多