这与如何将 `VNDocumentCameraViewControllerDelegate` 转换为 Swift 6 Concurrency 类似,但有一个警告是新的,因此可能需要不同的解决方案。
我有以下代码:
@MainActor
final class InterstitialWrapper: NSObject {
...
}
extension InterstitialWrapper: GADFullScreenContentDelegate {
func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
}
...
我收到此错误:
主参与者隔离实例方法'ad(_:didFailToPresentFullScreenContentWithError:)'不能用于满足非隔离协议要求;这是 Swift 6 语言模式下的错误
然后我使用
@preconcurrency
标签:
extension InterstitialWrapper: @preconcurrency GADFullScreenContentDelegate
错误变为:
主参与者隔离实例方法“ad(_:didFailToPresentFullScreenContentWithError:)”满足的协议要求参数中的不可发送类型“任何 GADFullScreenPresentingAd”不能跨越参与者边界;这是 Swift 6 语言模式下的错误
然后我用
@preconcurrency import
:
@preconcurrency import GoogleMobileAds
然后我得到:
“GoogleMobileAds”模块上的“@preconcurrency”属性无效
我已经验证这是唯一导入的文件
GoogleMobileAds
。
请注意,这类似于 如何将 `VNDocumentCameraViewControllerDelegate` 转换为 Swift 6 Concurrency,但关于
Non-sendable type 'any GADFullScreenPresentingAd'
的警告是新的。而且它不是一个系统框架,而是一个第三方框架(admob)。所以我在这里创建一个新问题,以防解决方案不同。
在旧 API 更新为使用
MainActor
之前(我希望这就是您所要求的),您可以使用 assumeIsolated
。如果您不在 MainActor
中运行该函数,这会使您的应用程序崩溃(比没有注意到要好)。
nonisolated func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
MainActor.assumeIsolated {
//Code Goes here
}
}