1. 引数がない場合
(1) 呼び出される側のSwiftで書かれたクラスが下記の場合
@objc class HogeCall : NSObject {
@objc func test() async -> String {
let text = "test call success"
return text
}
(2) 呼び出す側のObjective-Cのコードは下記のようになる
#import "MyProject-Swift.h"
HogeCall *module = [[HogeCall alloc] init];
[module testWithCompletionHandler:^(NSString *result) {
NSLog(@"test result: %@", result);
}];
・呼び出し側でSwiftのasyncに相当する、CompletionHandlerを記述する。
・Swiftのfunc名+WithCompletionHandler が命名規則となる。
2. 引数がある場合
(1) 呼び出される側のSwiftで書かれたクラスが下記の場合
@objc class HogeCall : NSObject {
@objc func test2(hoge:Double,fuga:Double) async -> String {
let text = "test call success"
return text
}
(2) 呼び出す側のObjective-Cのコードは下記のようになる
#import "MyProject-Swift.h"
HogeCall *module = [[HogeCall alloc] init];
[module test2WithHoge:1.0 fuga:2.0 completionHandler:^(NSString *result) {
NSLog(@"test2 result: %@", result);
}];
・呼び出し側でSwiftのasyncに相当する、CompletionHandlerを記述する。
・Swiftのfunc名+With+第1引数(頭文字は大文字に変換)が命名規則となる。
Xcodeでコードを記述するとき、コード補完候補が表示されるので補完候補を選択すればスムーズにコードが書ける。
例えば、上記の例だとObjective-Cのクラスで
[module test2WithHogeと記述するとコード補完候補が表示され、Swiftのクラスを呼び出すコードをスムーズに書くことができる。
参考記事:
https://forums.swift.org/t/concurrency-interoperability-with-objective-c/41616
https://github.com/apple/swift-evolution/blob/main/proposals/0297-concurrency-objc.md