无法赋值String类型的值:NSObject类型为String:NSObject

时间:2016-03-20 14:52:43

标签: arrays xcode swift swift2 nsdictionary

我有一个字典/数组,看起来像这样:

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

3 个答案:

答案 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]] = []