我有一个字典/数组,看起来像这样:
var myArray: [[String:NSObject]] = []
let newItem = [
[
"caseNumber" : caseToAdd,
"formType" : formType,
"caseStatus" : caseStatus,
"caseDetails" : caseDetails,
"caseLUD" : caseLUD,
"friendlyName" : ""
]]
//Add new item to existing array
myArray += newItem
这工作正常,我可以访问项目等。但现在我想将它保存到NSUserDefaults所以我将来可以再次访问它。我可以保存得很好,但是再次加载它会给我一个问题:
myArray = HelperSavedData().loadMyCasesFromNSUserDefaults
这是HelperSavedData类:
public class HelperSavedData {
let defaults = NSUserDefaults.standardUserDefaults()
public func saveMyCasesToNSUserDefaults(input:NSObject){
defaults.setObject(input, forKey: "myArray")
defaults.synchronize()
}
public func loadMyCasesFromNSUserDefaults() -> [[String:NSObject]]? {
if let savedArray = defaults.valueForKey("myArray") {
return ((savedArray) as! [[String : NSObject]])
}
return nil
}
}
但我收到错误:
无法指定type() - >的值[[String:NSObject]]?输入[[String:NSObject]]
答案 0 :(得分:1)
如果没有一定量的展开,则无法将可选类型指定给非可选类型。
您已将myArray
定义为非可选的词典数组。
var myArray: [[String:NSObject]] = []
变量myArray
永远不能是nil
。
您已将loadMyCasesFromNSUserDefaults()
定义为返回可选的字典数组。
public func loadMyCasesFromNSUserDefaults() -> [[String:NSObject]]?
也就是说,此方法可以返回nil
。
因此,我们必须决定在如何处理变量方面最有意义的事情。是否允许nil
分配到我们的myArray
变量中是否有意义?如果是这样,请将其设为可选项,如其他答案所示:
var myArray: [[String:NSObject]]?
但也许myArray
nil
永远不会有意义。在这种情况下,请勿更改myArray
的声明。相反,确定我们如何处理方法返回nil
的情况。
我们可以说......如果我们从方法中加载非nil数组,我们只想分配到myArray
:
var myArray = [[String:NSObject]]()
if let loadedArray = loadMyCasesFromNSUserDefaults() {
myArray = loadedArray
}
myArray += newItem
如果myArray
返回loadMyCasesFromNSUserDefaults()
,我们可以使用Nil-Coalescing运算符并将默认值分配到nil
。
var myArray = loadMyCasesFromNSUserDefaults() ?? [newItem]
还有很多其他方法可以处理nil
和可选项。
这里的关键是,我们需要做出一些决定。
myArray
是否应该nil
?这有意义吗?myArray
不应该是nil
,那么处理我们的方法返回nil
的情况有什么意义呢?我们该如何处理?答案 1 :(得分:0)
您从loadMyCasesFromNSUserDefaults()
返回可选值并尝试将其保存在非可选值中。尝试像这样更改myArray
声明
var myArray: [[String:NSObject]]?
答案 2 :(得分:-1)
loadMyCasesFromNSUserDefaults()
返回[[String:NSObject]]?
这是一个可选值,请尝试var myArray?: [[String:NSObject]] = []