我如何遵守与演员的协议?

Jos*_*oid 14 actor swift swift-protocols

当我尝试定义actor符合 a 的an 时protocol,Xcode 给出错误Actor-isolated instance method 'foo()' cannot be used to satisfy nonisolated protocol requirementnonisolated我可以实现我认为我不想做的功能。我需要吗?如果我这样做的话我会失去什么?

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

protocol Fooable {
    func foo() -> Int
}

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

Rob*_*Rob 16

如果您点击错误消息前面的 \xe2\x80\x9cauto fix\xe2\x80\x9d 按钮,它将展开以显示两个选项:

\n

在此输入图像描述

\n

简而言之,您可以:

\n
    \n
  • 添加nonisolatedfoo()使该实例方法不与参与者隔离:

    \n
    protocol Fooable {\n    func foo() -> Int\n}\n\nactor Bar: Fooable {\n    nonisolated func foo() -> Int {\n        return 42\n    }\n}\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 标记协议要求foo() async以允许参与者隔离的一致性:

    \n
    protocol Fooable {\n    func foo() async -> Int\n}\n\nactor Bar: Fooable {\n    func foo() -> Int {\n        return 42\n    }\n}\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

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

\n
\n

您询问是否可以使用 nonisolated

\n
\n

如果我这样做的话我会失去什么?

\n
\n

如果是nonisolated,则该方法根本无法直接访问参与者隔离的属性,也不能调用参与者隔离的方法。按照目前的方法,您可以安全地完成它nonisolated

\n

简而言之,如果一个方法不需要参与者隔离,那么您通常应该随意将其标记为nonisolated

\n