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]]
并将它们分配给属性 id
和 expression
【讨论】:
以上是关于Swift & Firebase - 无法转换类型“__NSDictionaryM”的值的主要内容,如果未能解决你的问题,请参考以下文章
Firebase + Swift:无法删除 tableView 中的行
无法调用非函数类型“任何?!”的值:- Firebase,Swift3