Swift中如何访问[String: Any]类型字典内的hasReadMessage属性值
解决方案
你遇到的编译错误有两个核心原因:
dictionary["lastMessage"]取出的是Any?类型,Swift 不允许直接对 Any 类型做属性访问,必须先转换为对应的真实类型。- 从
DataSnapshot解析出来的嵌套结构是字典类型,不能用点语法访问属性,只能通过键下标取值。
安全的分步写法(推荐)
这种写法通过可选绑定做类型校验,避免类型不匹配导致的运行时崩溃:
if let childSnapshot = child as? DataSnapshot { guard let dictionary = childSnapshot.value as? [String: Any] else { return } // 先把lastMessage转换为[String: Any]字典类型 guard let lastMessageDict = dictionary["lastMessage"] as? [String: Any] else { return } // 再从嵌套字典中取出hasReadMessage,根据你给出的结构是Int类型 guard let hasReadMessage = lastMessageDict["hasReadMessage"] as? Int else { return } // 后续直接使用hasReadMessage即可,0代表未读,1代表已读 print(hasReadMessage) }
可选链简写写法
如果不需要分步处理类型不匹配的异常,可以用可选链简化代码,得到的是Int?类型的结果,使用时自行解包即可:
let hasReadMessage = (dictionary["lastMessage"] as? [String: Any])?["hasReadMessage"] as? Int
内容的提问来源于stack exchange,提问作者zak
相关产品推荐
相关产品推荐

