swiftactorswift-protocols

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
    }
}

Solution

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

    enter image description here

    In short, you can either:

    In short, an isolated method cannot be used to satisfy a nonisolated requirement.


    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.