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
}
}
CodePudding user response:
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
nonisolatedtofoo()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()asyncto 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.

