斯威夫特& Firebase - 无法投放类型' __ NSDictionaryM'

时间:2017-02-12 10:20:52

标签: ios swift firebase firebase-realtime-database

我正在使用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]

非常感谢你的帮助。

祝你有个美好的一天。

1 个答案:

答案 0 :(得分:1)

let levelExpressions = dictionary["expressions"]

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

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

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