如何在Swift的Task修饰符中调用defer?我想在defer中执行清理操作。这包括将loadingState设置为.idle,将selectedImage设置为nil等。无论是否抛出异常,defer代码都应该触发。
Task {
do {
defer {
print("DEFER")
self.selectedImage = nil
loadingState = .idle
chatText = ""
}
try await sendMessage()
print("")
} catch {
print(error.localizedDescription)
}
}
但是我得到了下面的编译错误:
无法从主参与者变更主参与者隔离属性“loadingState”
任何帮助都很感激。
更新日期:
Task { @MainActor in
do {
defer {
print("DEFER")
loadingState = .idle
self.selectedImage = nil
loadingState = .idle
chatText = ""
}
try await sendMessage()
} catch {
print(error.localizedDescription)
}
}
更新2
下面是产生类似错误的最小代码:
enum SampleError: Error {
case operationFailed
}
func doSomething() {
var age = 40
Task {
do {
defer {
age = 50
}
throw SampleError.operationFailed
} catch {
print(error)
}
}
}
doSomething()
1条答案
按热度按时间p5fdfcr11#
这是Swift编译器中最近修复的一个已知错误。它应该在Swift 5.8中**得到解决 *(在撰写本文时,最新版本是Swift 5.7)。
请参见this patch to the Swift compiler,您可以下载Swift的最新开发快照进行试用(但您不能使用此快照将应用部署到App Store)。
这使下面的(简化的)代码示例能够正确编译。