Avatar
Avatar
koher
考えました&読みました。iPhoneからなので読みにくいかもだけど。 @MainActorなクラスのサブクラスからメソッドをオーバーライドするときに、asyncでなくす(同期にする)ことも可能なんじゃないかと思いました。同期の方が型が狭いし。オーバーライドしてactor-isolatedなAPIや非同期APIを触らないのなら。superでオーバーライドされるメソッドを呼ぶ場合は必然的にawaitが必要になり、asyncになる。もしくは、オーバーライド先にも@MainActorを付けて、同期呼び出しする。もしスーパークラスのインスタンスとして扱われて同期的にそのメソッドが呼ばれても、スレッドセーフなので安全。 サブクラスのインスタンスとして扱われてる場合は同期に見えるから、「無意味にasync化」が起こらない。 オーバーライドでも勝手に@MainActor化しない方が、明示的でいい気がしてきた。 (edited)
そうですね。 asyncについても、オーバーライドはできるかわからないけど、 () -> ()() -> async () に代入する事は実際できる気がする。 オーバーライドの考え方は、代入できる=親側の型としてみなして呼び出せる、なので。 サブクラス側のシンボルが見えてるときには狭い型として扱えたほうが嬉しい、というのは同期/非同期だとわかりやすいですね。
👍 1