macOS Swift结合Firebase时append实例方法无精确匹配报错
报错原因
No exact matches in call to instance method 'append' 这个错误的核心原因是数组声明的元素类型和你要追加的对象类型不匹配:
- 你声明的数据源数组是
[CustomerData],要求存入的元素必须是CustomerData类型 - 你实际创建的实例是
Customers类型(名称比数组元素类型多了个结尾的s),两个是完全独立的类型,编译器找不到接收Customers类型参数的append方法,就会抛出这个错误。
另外你的代码里还有几处语法和逻辑错误,会直接导致表格无法正常显示数据,一起修复即可。
修复方案
统一模型类型命名
二选一即可:- 把数组声明改成
var customerArray: [Customers](),和你实例化的类型名保持一致 - 把实例化对象的类型从
Customers改成CustomerData,和数组声明的元素类型保持一致
注意:原代码里声明数组写的Var首字母大写,Swift关键字为小写var,这也是一处编译错误,需要修正。
- 把数组声明改成
修复NSTableView数据源代理的语法错误
原代码创建cell的逻辑缺少可选绑定,语法不合法,替换为以下代码:
func numberOfRows(in tableView: NSTableView) -> Int { return customerArray.count } func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> NSTableCellView?{ guard let cell = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? NSTableCellView else { return nil } let customer = customerArray[row] cell.textField?.stringValue = customer.fullName return cell }
- 优化Firebase数据加载逻辑
原代码在循环遍历数据时每追加一个元素就刷新一次表格,性能很差,且快照参数名首字母大写不符合Swift命名规范,调整为所有数据解析完成后统一回到主线程刷新表格:
func loadCustomers(){ db.collection(self.collectionName).addSnapshotListener { [weak self] (querySnapshot, error) in guard let self = self else { return } self.customerArray.removeAll() if let error = error { print("Error getting documents, \(error)") return } guard let documents = querySnapshot?.documents else { return } for document in documents { print("\(document.documentID) => \(document.data())") let data = document.data() guard let customerName = data["fullName"] as? String, let customerNumber = data["phoneNum"] as? String else { continue } // 注意:这里初始化的模型类型必须和customerArray的元素类型完全一致 let newCustomer = CustomerData( id: document.documentID, fullName: customerName, phoneNum: customerNumber, email: "", address: "", profession: "", age: "", dateOfBirth: "" ) self.customerArray.append(newCustomer) } // 所有数据处理完成后再回到主线程刷新UI DispatchQueue.main.async { self.tableView.reloadData() } } }
- 最后检查配置项
- 确认NSTableView的
dataSource、delegate已经正确关联到当前控制器 - 确认表格列、单元格的Identifier设置和代码中调用的一致
- 确认模型类/结构体的构造器参数和你初始化时传入的属性完全匹配,没有参数缺失、类型不匹配的问题
- 确认NSTableView的
内容的提问来源于stack exchange,提问作者Mariglen Meta
相关产品推荐
相关产品推荐

