【问题标题】:How to save an array of strings using NSUserDefaults in swift如何在 swift 中使用 NSUserDefaults 保存字符串数组
【发布时间】:2015-07-23 04:51:40
【问题描述】:

我正在尝试使用 NSUserDefaults 快速保存一个字符串数组。我四处搜索并相信我必须使用 [NSString] 而不是 [String] 但是应用程序仍然崩溃并出现错误

致命错误:在展开可选值时意外发现 nil

我看不出我做错了什么,因为它可以很好地保存整数和字符串。这是我的数据单例和 NSUserDefaults 的代码。

struct DefaultsKeys
{
  static let myString  = "myString"
  static let myInt  = "myInt"
  static let myArray = "myArray"

}



class DataContainerSingleton
{
  static let sharedDataContainer = DataContainerSingleton()


  var myString: String?
  var myInt: Int?
  var myArray:[NSString]?

/* I have also tried:
  var myArray:[NSString] = [NSString]() */



  var goToBackgroundObserver: AnyObject?

  init()
  {
    let defaults = NSUserDefaults.standardUserDefaults()


    myString = defaults.objectForKey(DefaultsKeys.myString) as! String?
    myInt = defaults.objectForKey(DefaultsKeys.myInt) as! Int?
    myArray = defaults.objectForKey(DefaultsKeys.myArray) as! [NSString]?



    goToBackgroundObserver = NSNotificationCenter.defaultCenter().addObserverForName(
      UIApplicationDidEnterBackgroundNotification,
      object: nil,
      queue: nil)
      {
        (note: NSNotification!) -> Void in
        let defaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject( self.myString, forKey: DefaultsKeys.my)
        defaults.setObject( self.myInt, forKey: DefaultsKeys.myInt)
        defaults.setObject( self.myArray, forKey: DefaultsKeys.myArray)


        defaults.synchronize()
    }
  }
}

【问题讨论】:

  • 错误出现在哪一行?
  • 好的。所以我认为问题不在于 NSUserDefaults 的实现,而在于访问应用程序中其他地方的值。如果我可以初始化数据容器中的数组而不是使其成为可选的,那将使我的生活变得更加轻松。有没有办法让这个工作?

标签: ios swift nsstring nsuserdefaults swift-array


【解决方案1】:
        <!-- language: swift -->

        //declare and initiate the array        
        var sample_array : NSMutableArray! = []
        //use mutable array to add data

        //variable to store value in array
        var say: String! =  "Hello"

        //add values in array
        sample_array.addObject("hello")
        //or
        //sample_array.addObject(say)

        /*
        //you can also save values in array like this
        var sample_array: Array<String> = []
        var say: String! =  "Hello"
        sample_array = ["Qwerty"]
        sample_array.insert(say, atIndex: 1)
        println(sample_array)
        */

        //archive and saving data 
        let data = NSKeyedArchiver.archivedDataWithRootObject(sample_array)
        NSUserDefaults.standardUserDefaults().setObject(data, forKey: "array_key")
        NSUserDefaults.standardUserDefaults().synchronize()

        //unarchive and getting data
        if let data = NSUserDefaults.standardUserDefaults().objectForKey("array_key") as? NSData {
        stopover_array = NSKeyedUnarchiver.unarchiveObjectWithData(data)  as NSMutableArray
            }

【讨论】:

    【解决方案2】:

    问题是代码:

    myString = defaults.objectForKey(DefaultsKeys.myInt) as! String?
    myInt = defaults.objectForKey(DefaultsKeys.myInt) as! Int?
    myArray = defaults.objectForKey(DefaultsKeys.myArray) as! [NSString]?
    

    as! 表示打开一个可选值,这就是您的应用因错误而崩溃的原因

    fatal error: unexpectedly found nil while unwrapping an Optional value
    

    如果defaults.objectForKey(DefaultsKeys.myInt) 为 nil,则不允许展开 nil。你应该使用

    myString = defaults.objectForKey(DefaultsKeys.myInt) as? String
    

    改为。

    【讨论】:

    • 我已经尝试初始化数组,如我的代码所示,该代码在属性声明下方被注释掉,但它说我必须使用 as!转换任何对象?到 [NSString]。我很困惑,因为我将它声明为类型 [NSString] 并初始化为 [NSString]()。知道发生了什么吗?
    • 如果你将属性声明为非可选,你应该使用as!
    • 好吧,所以我设法让它工作,让它作为一个可选的,并在我的代码中添加一堆值检查。
    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多