我正在使用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]
非常感谢你的帮助。
祝你有个美好的一天。
答案 0 :(得分:1)
let levelExpressions = dictionary["expressions"]
上面的行返回字典数组,即[[String:Any]]
,并且需要将该值映射到结构Expression.This可以通过两种方式完成: -
1)您可以使用ObjectMapper对上述代码的返回值进行类型转换。
2)通过解析返回值来手动分配Expression
对象
let levelExpressions = dictionary["expressions"] as! [[String:Any]]
并将其分配给属性id
和expression