swift 我该如何遵守演员的协议?

0md85ypi  于 2022-12-10  发布在  Swift
关注(0)|答案(1)|浏览(100)

当我试图定义一个符合protocolactor时,Xcode给我的错误是Actor-isolated instance method 'foo()' cannot be used to satisfy nonisolated protocol requirement。我可以把函数变成我不想做的nonisolated。我需要这样做吗?如果这样做,我会失去什么?
以下是导致错误的示例代码:

protocol Fooable {
    func foo() -> Int
}

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

rlcwz9us1#

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

简而言之,您可以:

  • nonisolated添加到foo(),使此示例方法不与参与者隔离:
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
    }
}

简而言之,协议需要知道该方法是否可以跨参与者边界同步调用(即,它是否是非隔离的)。
您询问是否可以使用nonisolated
如果我这样做,我会失去什么?
如果它是nonisolated,则该方法不能直接访问操作符隔离的属性,也不能调用操作符隔离的方法。
简而言之,如果一个方法不需要参与者隔离,那么您通常可以随意将其标记为nonisolated

相关问题