Are those bugs or designed behaviors?
@MainActor
class Object {
@MainActor // can be implicit
var num = 0
}
@MainActor
struct Foo {
@MainActor // can be implicit
let object = Object()
@MainActor // can be implicit
func foo() {
func bar_1() -> Int {
// ERROR: Property 'num' isolated to global actor 'MainActor' can not be
// referenced from this synchronous context
object.num
}
@MainActor // workaround
func bar_2() -> Int {
object.num // okay
}
var num_1: Int {
get {
// ERROR: Property 'num' isolated to global actor 'MainActor' can not be
// referenced from this synchronous context
object.num
}
}
var num_2: Int {
get async {
// ERROR: Expression is 'async' but is not marked with 'await'
/* await */ object.num
}
}
// Basically fixed `num_2`.
// This one is trivial, but not what I actually need.
var num_3: Int {
get async {
await object.num
}
}
// ERROR: Local variable 'num_4' cannot have a global actor
@MainActor
var num_4: Int {
get async {
await object.num
}
}
}
}
The global actors proposal says in it's detailed design that "Local variables and constants cannot be marked with a global actor attribute", but why? If they cannot be marked, then they do or don't inherit the actor's protective isolation?
- Why does
bar_2
work andbar_1
doesn't? - Why is
num_1
not allowed?
This was tested with Xcode Beta 4.