Swift Mac应用查询本地MongoDB遇类型歧义错误及优化咨询
问题解决与优化建议
一、解决Type of expression is ambiguous without more context错误
这个错误源于编译器无法自动推断find方法的重载类型,可从以下几个方向修复:
1. 显式指定闭包的结果类型
给闭包参数添加明确的类型标注,消除编译器的推断歧义:
collection.find(queryFilter, session: mongoSession) { (result: Result<MongoCursor<Holiday>, Error>) in switch result { case .failure(let error): print(error) case .success(let cursor): // 遍历游标获取文档 for try await doc in cursor { print(doc.date_no_dash) } } }
2. 检查会话参数的必要性
如果你的业务逻辑不需要客户端会话,直接省略session参数,减少重载匹配的复杂度:
collection.find(queryFilter) { result in // ... 后续处理逻辑 }
若必须使用会话,确认mongoSession是已初始化的ClientSession实例,而非可选值(如果是可选值需先解包,比如session: mongoSession!或通过可选绑定处理)。
3. 简化BSON过滤器写法
无需手动用BSON(integerLiteral:)包装整数,Swift驱动会自动将Swift基本类型转换为BSON类型,简化后代码更清晰:
let queryFilter: BSONDocument = [ "date_no_dash": [ "$gte": (year - buffer) * 10_000, "$lte": ((year + buffer) * 10_000) - 1 ] ]
二、更优雅的错误处理方案
推荐使用async/await语法替代闭包回调,配合do-try-catch处理错误,代码结构更简洁直观(要求MongoDB Swift驱动5.0+,且代码在异步上下文执行):
// 在异步函数中执行查询逻辑 func fetchHolidays() async { let year: Int = 2022 let buffer: Int = 1 let collection = mongodb.collection("holidays", withType: Holiday.self) let queryFilter: BSONDocument = [ "date_no_dash": [ "$gte": (year - buffer) * 10_000, "$lte": ((year + buffer) * 10_000) - 1 ] ] do { let cursor = try await collection.find(queryFilter) for try await doc in cursor { print(doc.date_no_dash) } } catch { print("查询失败:\(error)") } }
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

