用户默认值在 Swift 3.0 中给出 nil 值

User defaults gives nil value in Swift 3.0

我是 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

}

应用程序崩溃并出现 "fatal error: unexpectedly found nil while unwrapping an Optional value" 异常。

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

谢谢。

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

这样做:

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

尝试转换为 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
}
}

我有两个可能的原因:

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

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

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