You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 6并发环境下NSTextAttachmentViewProvider子类化编译报错问题

Swift 6下NSTextAttachmentViewProvider子类化的编译错误解决

问题重现

自定义NSTextAttachmentViewProvider子类的代码(修正了原代码的语法错误):

final class ShapeViewProvider: NSTextAttachmentViewProvider {
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .red

        self.view = view
    }
}

编译时报错:

在同步非隔离上下文中调用了主Actor隔离的初始化器'init()'

尝试给类或方法添加@MainActor注解后,新报错:

主Actor隔离的实例方法'loadView()'与非隔离的重写声明存在不同的Actor隔离属性

解决方法

核心原因是Swift 6中NSTextAttachmentViewProvider的初始化器被标记为@MainActor,但loadView()方法是nonisolated的。正确写法需要同时满足类的主Actor隔离、loadView()的非隔离声明,并在方法中确保访问主Actor隔离属性时处于正确上下文:

@MainActor
final class ShapeViewProvider: NSTextAttachmentViewProvider {
    // 显式标注nonisolated,匹配父类方法的隔离属性
    nonisolated override func loadView() {
        let view = UIView()
        view.backgroundColor = .red
        
        // 切换到主Actor上下文,访问被隔离的self.view
        Task { @MainActor in
            self.view = view
        }
    }
}

关键说明

  • 给自定义类添加@MainActor,确保初始化时处于主Actor上下文,符合父类初始化器的隔离要求。
  • 显式给loadView()添加nonisolated,避免和父类的非隔离方法声明冲突。
  • 在loadView()中给self.view赋值时,通过Task { @MainActor in ... }切换到主Actor,因为self是主Actor隔离的,不能在非隔离上下文中直接访问其属性。

内容的提问来源于stack exchange,提问作者rckoenes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:02:40