SwiftUI调用Contentful client.fetchArray报错:表达式类型不明确
SwiftUI中Contentful API fetchArray调用出现「表达式类型不明确」错误的解决方案
问题根源分析
编译器无法明确fetchArray闭包中Result的具体类型,主要由两个细节问题导致:
- Query未指定泛型类型,编译器无法判定查询目标的类型
- Result枚举错误分支使用了
.error,而Contentful SDK遵循Swift标准库Result类型的定义,错误分支应为.failure
修复步骤
1. 明确指定Query的泛型类型
原代码中Query.where(contentTypeId: id)未限定泛型,需补充Entry类型声明,让编译器明确查询目标:
let query = Query<Entry>.where(contentTypeId: id)
2. 修正Result枚举的错误分支
将原代码中的.error替换为标准Result类型的.failure分支:
case .failure(let error): print(error)
修改后的完整getArray函数
func getArray(id: String, completion: @escaping([Entry]) -> ()) { // 指定Query泛型为Entry let query = Query<Entry>.where(contentTypeId: id) client.fetchArray(of: Entry.self, matching: query) { result in switch result { case .success(let array): DispatchQueue.main.async { completion(array.items) } // 修正为标准的.failure分支 case .failure(let error): print(error) } print(result) } }
额外优化建议
原代码中使用as!强制解包字段值存在崩溃风险,建议改用可选绑定处理:
getArray(id: "course") { (items) in items.forEach { (item) in guard let title = item.fields["title"] as? String, let subtitle = item.fields["subtitle"] as? String, let image = item.fields["image"] as? String, let logo = item.fields["logo"] as? String, let color = colors.randomElement() else { return } self.courses.append(Course( title: title, subtitle: subtitle, image: image, logo: logo, color: color, show: false)) } }
内容的提问来源于stack exchange,提问作者yitak lee
相关产品推荐
相关产品推荐

