无法将类型 String:NSObject 的值分配给类型 String:NSObject

Cannot assign value of type String:NSObject to type String:NSObject

我有一个 dictionary/array,看起来像这样:

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 class:

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

但我收到错误消息:

Cannot assign value of type () -> [[String: NSObject]]? to type [[String: NSObject]]

您正在从 loadMyCasesFromNSUserDefaults() 返回一个 可选值 并尝试将其保存为 非可选值 。尝试像这样更改 myArray 声明

var myArray: [[String:NSObject]]?

loadMyCasesFromNSUserDefaults() return [[String:NSObject]]? 是一个可选值,请尝试 var myArray?: [[String:NSObject]] = []

如果不进行一定程度的展开,您不能将可选类型分配给非可选类型。

您已将 myArray 定义为非可选字典数组。

var myArray: [[String:NSObject]] = []

变量,myArray永远不能是nil

您已将 loadMyCasesFromNSUserDefaults() 定义为 return 一个可选的字典数组。

public func loadMyCasesFromNSUserDefaults() -> [[String:NSObject]]?

也就是说,这个方法可以 return nil.

所以我们必须决定在如何处理我们的变量方面什么最有意义。允许将 nil 分配给我们的 myArray 变量有意义吗?如果是这样,请按照其他答案的建议将其设为可选:

var myArray: [[String:NSObject]]?

但也许 myArray 成为 nil 永远没有意义。在这种情况下,不要更改 myArray 的声明。相反,确定我们如何处理您的方法 returns nil.

的情况

我们可以说...如果我们从方法加载一个非 nil 数组,我们只想分配给 myArray

var myArray = [[String:NSObject]]()

if let loadedArray = loadMyCasesFromNSUserDefaults() {
    myArray = loadedArray
}

myArray += newItem

或者我们可以使用 Nil-Coalescing 运算符并将默认值分配给 myArray if loadMyCasesFromNSUserDefaults() returns nil.

var myArray = loadMyCasesFromNSUserDefaults() ?? [newItem]

还有很多其他方法可以处理 nil 和可选值。

这里的关键是我们需要做出一些决定。

  • myArray 应该被允许成为 nil 吗?这有意义吗?
  • 如果 myArray 不应该是 nil,那么处理我们的方法 returns nil 的情况有什么意义?我们要如何处理?