Copyright (C) iPhoneアプリ開発備忘録 All rights reserved.
ブログ内で記したコード、内容の正確性は保証いたしません。
記載内容を実装したことにより発生した不具合・損害等の責任は一切負いません。



2022年08月14日

Objective-Cクラスからasync属性のSwiftクラスを呼び出す



Objective-Cクラスからasync属性のSwiftクラスを呼び出す場合、呼び出し側のObjective-Cクラスにおいて、呼び出される側のSwiftクラスのasyncに相当する記述(completionHandler)が必要である。

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




posted by mobileDeveloper at 14:42 | Comment(0) | TrackBack(0) | 開発の流れ はてなブックマーク - Objective-Cクラスからasync属性のSwiftクラスを呼び出す | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
Apple、Appleのロゴ、App Store、iPodのロゴ、iTunesは、米国および他国のApple Inc.の登録商標です。
iPhone、iPod touch、iPadはApple Inc.の商標です。
iPhone商標は、アイホン株式会社のライセンスに基づき使用されています。
その他、本ブログに記載されている製品名、会社名は、それぞれ各社の商標または登録商標です。