How do I conform to a protocol with an actor?

How do I conform to a protocol with an actor?

Problem Description:

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 – 1

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:

  • 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 (i.e., 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.

Rate this post
We use cookies in order to give you the best possible experience on our website. By continuing to use this site, you agree to our use of cookies.
Accept
Reject