从Firestore获取集合赋值时遇‘表达式类型模糊’错误求助
解决Firestore获取集合时的“表达式类型模糊”及“找不到Firestore”错误
问题根源分析
你遇到的两个错误本质是模块导入拼写错误和Swift类型推断失效导致的:
Cannot find 'Firestore' in scope:大概率是导入模块时拼写错误(把FirebaseFirestore写成了FirebaseFireStore,注意store是小写s)。Type of expression is ambiguous without more context:Firestore的addSnapshotListener闭包参数类型未显式指定,Swift无法自动推断,导致歧义。
修正步骤及代码
1. 修正导入语句(解决“找不到Firestore”错误)
确保在CategoryViewModel中导入正确的Firebase子模块,注意大小写:
import Foundation import Firebase import FirebaseFirestore // 正确拼写:小写s的Firestore import FirebaseFirestoreSwift
2. 显式指定闭包参数类型(解决“表达式类型模糊”错误)
在addSnapshotListener的闭包中,给querySnapshot和error加上明确的类型标注,消除Swift的推断歧义:
修正后的CategoryViewModel代码
import Foundation import Firebase import FirebaseFirestore import FirebaseFirestoreSwift class CategoryViewModel: ObservableObject{ @Published var categories: [Category] = [] private var categoriesDBReference = Firestore.firestore().collection("categories") func fetch(){ // 显式指定闭包参数类型:QuerySnapshot? 和 Error? categoriesDBReference.addSnapshotListener { (querySnapshot: QuerySnapshot?, error: Error?) in guard let documents = querySnapshot?.documents else{ print("No documents retrieved when fetching all categories.") return } self.categories = documents.compactMap { queryDocumentSnapshot -> Category? in return try? queryDocumentSnapshot.data(as: Category.self) } } } }
Category结构体无需修改
import Foundation import FirebaseFirestoreSwift struct Category: Codable, Identifiable, Hashable{ @DocumentID var id: String? var categoryName: String? }
额外检查点
- 确认Swift Package Manager中已添加
FirebaseFirestore和FirebaseFirestoreSwift依赖,且版本与Firebase主库兼容。 - 验证Firestore控制台中
categories集合的字段名(categoryName)与结构体属性完全一致,包括大小写。
内容的提问来源于stack exchange,提问作者Ravindu Wataketiya
相关产品推荐
相关产品推荐

