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

问题描述:

我是swift的新手,尝试将NSMutableArray存储在Userdefaults中。这里就是我doinig:用户默认值在Swift 3.0中给出零值

//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 

}

应用与崩溃 “致命错误:意外发现零,同时展开一个可选值” 异常。

忽略我问这个问题的方式,帮我看看这里。

谢谢。

+0

1.不要在斯威夫特使用'NSMutableArray'。使用Swift数组。 2.阵列中有哪些对象? – rmaddy

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

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

要完成这个任务:

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

我有2倍可能的原因这个:

  1. 您需要100%确定您使用与保存相同的密钥来检索数组。在你的代码中,你用“ArrayKey”保存数组,但用NSUserDefaultsKey.LIST_ID_ARRAY检索它,你确定这是同一个字符串吗?
  2. 什么数据类型是self.listId?如果它是一个自定义类,那么你需要做的是类符合NSCoding协议,然后将其编码成数据并保存到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() 
} 
+0

好的,你的第一点是满的,即我使用相同的密钥。其次,列表是我在数组中存储的字符串因为我需要根据用户选择的项目在数组中存储多个listIds。 –

+0

好吧,看起来还有第三个原因:在实际存储任何东西之前,您正试图从userdefaults访问对象。 'UserDefaults.standard.object(forKey:NSUserDefaultsKey.LIST_ID_ARRAY)'返回nil,你试图将它转换成NSMutableArray,它会崩溃 – SveinnV