Swift中的Task修饰符内部延迟

ldioqlga  于 2023-03-11  发布在  Swift
关注(0)|答案(1)|浏览(184)

如何在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()
p5fdfcr1

p5fdfcr11#

这是Swift编译器中最近修复的一个已知错误。它应该在Swift 5.8中**得到解决 *(在撰写本文时,最新版本是Swift 5.7)。
请参见this patch to the Swift compiler,您可以下载Swift的最新开发快照进行试用(但您不能使用此快照将应用部署到App Store)。
这使下面的(简化的)代码示例能够正确编译。

// Compiles on Swift 5.8+
@MainActor
class Tester {
    var x = 0
    
    func run() {
        Task {
            defer { x += 1 }
        }
    }   
}

相关问题