Swift调用append方法报No exact matches无精确匹配错误
报错根因
- 你使用
let声明的Posts是不可变常量,初始化后不允许修改内容,根本无法调用append、append(contentsOf:)这类会变更数组内容的方法 - 你直接将
Posts初始化为nil,即使声明为隐式解包可选类型,它本质仍是没有对应数组实例的空可选值,没有分配可存储元素的内存空间,自然无法执行追加操作 - 代码未对
Postsnapshot?.value转换得到的可选值dict做安全解包,一旦快照取值失败、类型转换不匹配,直接取dict.values会触发运行时崩溃
修复代码
首先将数组声明为可变var变量,提前初始化为空数组,对快照返回的可选值做安全解包后再执行元素追加操作,参考实现:
// 变量使用小驼峰命名,声明为可变var,初始化为空的目标类型数组 var posts = [[String: Any]]() // 安全解包快照转换结果,避免nil值崩溃 if let postDict = Postsnapshot?.value as? [String: [String: Any]] { posts.append(contentsOf: postDict.values) }
注意:Firebase实时数据库返回的字典默认是无序的,如果需要和你写入时的键顺序(P1、P2...)一致,可以在查询快照时调用排序API,或者拿到数组后自行按业务规则排序。
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

