【问题标题】:How do I conform to a protocol with an actor?我如何遵守与演员的协议?
【发布时间】:2022-12-18 21:54:51
【问题描述】:

当我尝试定义符合 protocolactor 时,Xcode 给我错误 Actor-isolated instance method 'foo()' cannot be used to satisfy nonisolated protocol requirement。我可以制作 func nonisolated 我不认为我想要。我需要吗?如果我这样做,我会失去什么?

这是导致错误的示例代码:

protocol Fooable {
    func foo() -> Int
}

actor Bar: Fooable { // Error: Actor-isolated instance method...
    func foo() -> Int {
        return 42
    }
}

【问题讨论】:

    标签: swift actor swift-protocols


    【解决方案1】:

    该错误告诉您您正在尝试使用参与者隔离的实例方法来满足非隔离协议要求。 actor-isolated 实例方法是一种只能在 actor 类中访问的方法,不能从 actor 范围之外访问。由于协议需要非隔离方法,因此您需要使 foo() 方法非隔离以满足协议要求。

    使 foo() 方法非隔离将允许其他符合 Fooable 协议的类访问 foo() 方法。如果您不使 foo() 方法成为非隔离的,则符合 Fooable 协议的其他类将无法访问 foo() 方法,这可能会导致意外行为。

    尝试

    protocol Fooable {
        func foo() -> Int
    }
    
    actor Bar: Fooable {
        @nonisolated func foo() -> Int {
            return 42
        }
    }
    

    【讨论】:

    • 如果没有@nonisolated 方法,actor 应该如何使用?我已经有一个符合 Fooable 的结构,希望用线程安全的 actor 替换它。那应该是可能的吗?我是演员的新手,如果我以错误的方式处理这件事,我深表歉意。
    【解决方案2】:

    如果您点击错误消息前面的“自动修复”按钮,它将展开并显示两个选项:

    简而言之,您可以:

    • nonisolated 添加到 foo() 以使此实例方法不与 actor 隔离:

      protocol Fooable {
          func foo() -> Int
      }
      
      actor Bar: Fooable {
          nonisolated func foo() -> Int {
              return 42
          }
      }
      
    • 标记协议要求 foo() async 以允许参与者隔离一致性:

      protocol Fooable {
          func foo() async -> Int
      }
      
      actor Bar: Fooable {
          func foo() -> Int {
              return 42
          }
      }
      

    简而言之,协议需要知道该方法是否可以跨参与者边界同步调用(即,它是否是非隔离的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2017-10-16
      • 2014-08-18
      相关资源
      最近更新 更多