1

我正在将一些代码库转换为使用 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 方库并以某种方式对其进行扩展,以使其符合适当的参与者隔离,而无需修改其源代码?

4

0 回答 0