我正在将一些代码库转换为使用 Swift 并发,并且在此过程中遇到了一些障碍。
我正在处理的当前项目有一些它依赖的第 3 方库,在其中一个库中,有一个委托协议,需要从其方法返回一些数据值。
以下是库中委托方法类型的示例:
public protocol FooDelegate: AnyObject {
func foo() -> CGFloat
}
我试图从协议的实现中返回一些值,如下所示:
extension ViewController: FooDelegate {
func foo() -> CGFloat { // <- Cannot satisfy requirement from protocol
view.bounds.height
}
}
如果不做任何修改,上述内容隐式地与 MainActor 隔离,不能满足 FooDelegate 协议的要求。
我尝试过的一种解决方案是使用以下标记功能实现nonisolated
:
extension ViewController: FooDelegate {
nonisolated func foo() -> CGFloat {
view.bounds.height // <- Cannot be referenced from a non-isolated context
}
}
但是这不起作用,因为它引用了视图控制器的视图。这导致view
从非隔离的同步上下文中引用。(还有一些其他问题,因为传递到任何委托函数的任何值都需要符合才能Sendable
跨参与者传递)。
我的问题是,有没有办法获取第 3 方库并以某种方式对其进行扩展,以使其符合适当的参与者隔离,而无需修改其源代码?