Swift & Firebase - 无法转换类型“__NSDictionaryM”的值

Posted

技术标签:

【中文标题】Swift & Firebase - 无法转换类型“__NSDictionaryM”的值【英文标题】:Swift & Firebase - Could not cast value of type '__NSDictionaryM' 【发布时间】:2017-02-12 10:20:51 【问题描述】:

我正在将 Swift 与 Firebase 一起使用,我对这个错误有点困惑:Could not cast value of type '__NSDictionaryM' (0x122ab6130) to 'Repeat.Expression' (0x1100004c0).

这是我使用的 JSON 文件的示例:


  "levels" : 
    "level1" : 
      "coverImage" : "lvl1",
      "expressions" : [ 
        "expression" : "Yes",
        "id" : 0
      , 
        "expression" : "Yes",
        "id" : 1
      , 
        "expression" : "Yes",
        "id" : 2
      , 
        "expression" : "Yes",
        "id" : 3
       ],
      "id" : 0,
      "title" : "Essentiel"
    ,
    "level2" : 
      ...
    ,
  

这是我使用的两个模型:

struct Level 
    let id : Int
    let coverImage : String
    let title : String
    let expressions : [Expression]


struct Expression 
    let id : Int
    let expression : String

最后,这是我用来获取关卡的函数:

var levels = [Level]()

func fetchLevels() 

        FIRDatabase.database().reference().child("levels").observe(.childAdded, with:  (snapshot) in

            if let dictionary = snapshot.value as? [String: AnyObject] 

                if let levelId = dictionary["id"], let levelCoverImage = dictionary["coverImage"], let levelTitle = dictionary["title"], let levelExpressions = dictionary["expressions"] 
                    let level = Level(
                        id: levelId as! Int,
                        coverImage: levelCoverImage as! String,
                        title: levelTitle as! String,
                        expressions: levelExpressions as! [Expression]
                    )
                    self.levels.append(level)
                


                DispatchQueue.main.async
                  self.collectionView?.reloadData()
                


            
        , withCancel: nil)
    

看来问题出在expressions: levelExpressions as! [Expression]这一行

非常感谢您的帮助。

祝你有美好的一天。

【问题讨论】:

levelExpressions 是一个 NSDictionaries 数组,而不是您的 Expression 类;您需要从字典中显式创建 Expression 的实例。 【参考方案1】:
let levelExpressions = dictionary["expressions"]

上面的行返回字典数组,即[[String:Any]],并且需要将该值映射到您的结构表达式中。这可以通过两种方式完成:-

1) 您可以使用ObjectMapper 对上述代码的返回值进行类型转换。

2) 通过解析返回值手动分配Expression对象 let levelExpressions = dictionary["expressions"] as! [[String:Any]] 并将它们分配给属性 idexpression

【讨论】:

以上是关于Swift & Firebase - 无法转换类型“__NSDictionaryM”的值的主要内容,如果未能解决你的问题,请参考以下文章

Firebase,Swift:无法检索数据

Swift 无法识别 Firebase 用户

Firebase + Swift:无法删除 tableView 中的行

无法调用非函数类型“任何?!”的值:- Firebase,Swift3

Swift,FIrebase - 无法通过 removeAllObservers 删除观察者

无法重新授权用户更改电子邮件或重置密码(Firebase .. Swift)