简体   繁体   中英

How do I conform to a protocol with an actor?

When I try to define an actor that conforms to a protocol , Xcode gives me the error Actor-isolated instance method 'foo()' cannot be used to satisfy nonisolated protocol requirement . I can make the func nonisolated I don't think I want to. Do I need to? What would I be losing if I do so?

Here's the example code that causes the error:

protocol Fooable {
    func foo() -> Int
}

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

If you tap on the “auto fix” button in front of the error message it will expand to show you two options:

在此处输入图像描述

In short, you can either:

  • Add nonisolated to foo() to make this instance method not isolated to the actor:

     protocol Fooable { func foo() -> Int } actor Bar: Fooable { nonisolated func foo() -> Int { return 42 } }
  • Mark the protocol requirement foo() async to allow actor-isolated conformance:

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

In short, the protocol needs to know whether the method can be called synchronously across actor-boundaries or not (ie, whether it is nonisolated or not).


You asked whether you could use nonisolated :

What would I be losing if I do so?

If it is nonisolated , the method simply cannot directly access actor-isolated properties nor call actor-isolated methods. As the method currently stands, you can safely make it nonisolated .

In short, if a method does not require actor-isolation, you should generally feel free to mark it as nonisolated .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM