swift - 异步等待 "Type of expression is ambiguous without more context"错误 - 在 swiftUI 中

标签 swift swiftui

在这一行 DispatchQueue.main.async我收到此错误:

Type of expression is ambiguous without more context

import Foundation

class ProductListViewModel: ObservableObject {
    @Published var productList = [Product]()
    let webService = WebService()
    
    func downloadData(url: URL) async {
        
        do {
            let product = try await webService.getData(url: url)
            DispatchQueue.main.async {
                self.productList = product.map(ProductViewModel.init)
            }
        } catch {
            print("error")
        }
    }
}

struct ProductViewModel {
    
    let productModel: Product
    var id: Int {
        productModel.id
    }
    var title: String {
        productModel.title
    }
    var price: Double {
        productModel.price
    }
    var description: String {
        productModel.description
    }
    var category: Category {
        productModel.category
    }
    var imageUrl: String {
        productModel.imageUrl
    }
    var rating: Rating {
        productModel.rating
    }
}

struct WebService {
    
    func getData(url: URL) async throws -> [Product] {
        let (data, _) = try await URLSession.shared.data(from: url)
        let product = try? JSONDecoder().decode([Product].self, from: data)
        return product ?? []
    }
}

最佳答案

错误(无可否认,这里是非描述性且无益的)是因为您试图设置 [ProductViewModel] (这是您的 map 返回的)到 productList这是类型 [Product] .ProductViewModel这里似乎没有目的——它只是产品的相同包装。您可以在 do 中更改您的代码阻止这个:

let products = try await webService.getData(url: url)
DispatchQueue.main.async {
    self.productList = products
}
要进一步重构,您应该注释您的 ProductListViewModel@MainActor确保在主队列上设置其属性,然后您可以摆脱 DispatchQueue.main.async来电——新async/await API 与 DispatchQueue 不能很好地混合反之亦然。
@MainActor class ProductListViewModel: ObservableObject {
    @Published var productList = [Product]()
    let webService = WebService()
    
    func downloadData(url: URL) async {
        do {
            let products = try await webService.getData(url: url)
            self.productList = products
        } catch {
            print("error")
        }
    }
}

关于swift - 异步等待 "Type of expression is ambiguous without more context"错误 - 在 swiftUI 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69915494/

相关文章:

ios - 中途向后滑动时的奇怪行为

swift - 是否可以编写一个函数来组成任意数量的 SwiftUI `ViewModifier' s?

ios - 实现 UserDefaults 时遇到问题

swift - 将 onChanged 回调添加到 SwiftUI 结构以发出值

ios - 带有 .Vertical axis going below keyboard 的多行文本字段

swift - 如何使用自定义 Swift 类声明 Objective-C 方法

swift - 在 swift 中向特定类型的数组添加自定义 init 方法

swift - Swift 中的单例用法

ios - 如何从小部件扩展导航到 UIKit viewController?

swift - IAd 横幅广告摇动屏幕