在Swift代码中,尝试将后台线程完成操作后,将结果切回主线程来更新@Published属性时,发现代码报错。
代码部分:
class IAPManager:ObservableObject {
@Published var products: [Product] = []
func loadProduct() async {
do {
print("加载产品中...")
let fetchedProducts = try await fetchProduct()
DispatchQueue.main.async {
products = fetchedProducts // 报错代码
}
print("成功加载产品: \(products)")
} catch {
print("加载产品失败:\(error)")
}
}
}
报错输出:
Reference to property 'products' in closure requires explicit use of 'self' to make capture semantics explicit
Reference 'self.' explicitly
Capture 'self' explicitly to enable implicit 'self' in this closure
报错原因为:在Swift闭包内访问类的属性(如products)时,需要明确的引用self。这样做是为了确保开发者清楚闭包会捕获self,避免意外的循环引用。
因此,解决方案为给闭包中访问类的属性添加self:
DispatchQueue.main.async {
self.products = fetchedProducts // 报错代码
}
这样做也是一种常见的做法,以提醒开发者闭包内的代码会捕获 self,尤其是在异步或长时间运行的任务中,以避免潜在的内存泄漏。