Avatar
Objective-Cのコールバック関数が自動でasync functionに変換される機能について質問です。 https://github.com/apple/swift-evolution/blob/main/proposals/0297-concurrency-objc.md 以下のようにObjective-Cで、メインスレッドかどうか確かめる文を含めたコールバック関数を作成し // MyClass.h #import <Foundation/Foundation.h> @interface MyClass : NSObject - (void)callbackWithCompletion:(void (^)(void))completion; @end // MyClass.m #import "MyClass.h" @implementation MyClass - (void)callbackWithCompletion:(void (^)(void))completion { NSLog(@"%d", [NSThread isMainThread]); // メインスレッドかどうか確かめる if (completion) { completion(); } } @end 以下のようにSwiftで呼び出しました // main.swift import Foundation Task { @MainActor in let myclass = MyClass() await myclass.callback() } RunLoop.main.run(until: Date(timeIntervalSinceNow: 10)) // 出力 1 通常のasync関数はMainActorで await hogeAsync() と呼び出してもhogeAsync の中身は MainActorで実行されない と思いますが 今回の callback はMainActorで await myclass.callback() と呼び出すと、callback の中身も MainActorで実行されている みたいでした つまり、このConcurrency Interoperability with Objective-C は 「シンタックス上の機能だけで、特別な処理(Objective-CのコールバックをSwiftのasyncに内部的に対応させる等)は行なっていない」 という理解であってますでしょうか? (edited)
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swift-evolution/0297-concurrency-objc.md at main · apple/swift-evolution