【问题标题】:User defaults gives nil value in Swift 3.0用户默认值在 Swift 3.0 中给出 nil 值
【发布时间】:2017-10-11 14:26:15
【问题描述】:

我是 swift 新手,并试图将 NSMutableArray 存储在 Userdefaults 中。这是我正在做的事情:

//to save aaray in user defaults
var set:NSMutableArray = NSMutableArray(objects: self.listId)
  self.saveListIdArray(set)

func saveListIdArray(_ params: NSMutableArray = []) {
let defaults = UserDefaults.standard
defaults.set(params, forKey: "ArrayKey")
defaults.synchronize()

}

//to get array from user default
func getUserDefaultKeyForAllObject(key userDefaultsKey: String) -> NSMutableArray {
let array = UserDefaults.standard.object(forKey: NSUserDefaultsKey.LIST_ID_ARRAY) as! NSMutableArray
print(array)
return array

}

应用程序因“致命错误:在展开可选值时意外发现 nil”异常而崩溃。

忽略我提问的方式,帮帮我。

谢谢。

【问题讨论】:

  • 1.不要在 Swift 中使用 NSMutableArray。使用 Swift 数组。 2.数组中有哪些对象?

标签: ios swift nsmutablearray nsuserdefaults


【解决方案1】:

我有两个可能的原因:

  1. 您需要 100% 确定检索数组时使用的密钥与保存时使用的密钥相同。在您的代码中,您使用“ArrayKey”保存数组,但使用 NSUserDefaultsKey.LIST_ID_ARRAY 检索它,您确定这是同一个字符串吗?
  2. self.listId 是什么数据类型?如果是自定义类,则需要使该类符合 nscoding 协议,然后将其编码为 Data 并将其保存到 userDefaults (Save custom objects into NSUserDefaults)

第三个原因是您试图从默认值中获取一个对象,而无需向其写入任何内容。尝试改变

let array = UserDefaults.standard.object(forKey: NSUserDefaultsKey.LIST_ID_ARRAY) as! NSMutableArray
print(array)
return array

到

if let array = UserDefaults.standard.object(forKey: "ArrayKey") as? NSMutableArray {
   print(array)
   return array
}
else {
   return NSMutableArray()
}

【讨论】:

  • 好的,您的第一点已满,即我使用的是相同的密钥。其次,列表是我存储在数组中的字符串,因为我需要根据用户选择的项目在数组中存储多个 listId。
  • 好的,所以似乎有第三个原因:在实际存储任何内容之前,您正试图从 userdefaults 访问对象。 'UserDefaults.standard.object(forKey: NSUserDefaultsKey.LIST_ID_ARRAY)' 正在返回 nil,您正在尝试将其强制转换为 NSMutableArray,这将崩溃
【解决方案2】:

尝试转换为 NSData,然后存储到 nsuserdefaults,如下所示

func saveListIdArray(_ params: NSMutableArray = []) {
let data = NSKeyedArchiver.archivedData(withRootObject: params) 

UserDefaults.standard.set(data, forKey: "test")
UserDefaults.standard.synchronize()
}

用于检索数据使用

if let data = UserDefaults.standard.object(forKey: "test") as? Data {
    if let storedData = NSKeyedUnarchiver.unarchiveObject(with: data) as? NSMutableArray 
{
            // In here you can access your array
}
}

【讨论】:

    【解决方案3】:

    您正在强制解开密钥的 NSMutableArray。当您尝试从字典或 UserDefault 中获取某个键的值时,请勿强制展开,因为该键的值可能不存在,并且强制展开会使您的应用程序崩溃。

    这样做:

     //to get array from user default
     if  let array = UserDefaults.standard.object(forKey:"ArrayKey") as? NSMutableArray
        print(array)
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多