【问题标题】:Swift & Firebase - Could not cast value of type '__NSDictionaryM'Swift & Firebase - 无法转换类型“__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 的实例。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:
let levelExpressions = dictionary["expressions"]

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多