📝
SwiftライブラリをObjective-Cから利用できるようにする
SwiftライブラリをObjective-Cから利用できるようにする設定と実装
Swiftで作成されたライブラリやクラスをObjective-Cから利用するためには、いくつかの設定と実装が必要です。以下の手順に従って設定を行うことで、Objective-CコードからSwiftコードにアクセスできるようになります。
1. SwiftコードにObjective-C互換性を持たせる
@objc
属性を追加
クラスとメソッドにSwiftクラスやメソッドをObjective-Cで利用するには、@objc
または@objcMembers
属性を使って公開する必要があります。
-
@objc
: 個別のクラスやメソッドに付与してObjective-Cで利用可能にします。 -
@objcMembers
: クラス全体に適用すると、そのクラス内のすべてのメソッドとプロパティがObjective-Cで利用可能になります。
// 個別のクラスやメソッドに@objcを指定する例
@objc class MySwiftClass: NSObject {
@objc func mySwiftMethod() {
// Objective-Cから呼び出せるメソッド
}
}
// クラス全体に@objcMembersを付ける例
@objcMembers class MySwiftClass: NSObject {
func mySwiftMethod() {
// Objective-Cから呼び出せるメソッド
}
}
Objective-Cで利用可能な型を使う
Objective-Cに公開するクラスやメソッドは、Objective-Cで利用可能な型を使用する必要があります。SwiftのString
やInt
などの一部の型は自動的に変換されますが、StructやEnumなどのSwift特有の型は使用できません。
Swiftの型 | Objective-Cでの型 |
---|---|
String |
NSString |
Int |
NSInteger |
Bool |
BOOL |
Array |
NSArray |
Dictionary |
NSDictionary |
2. ターゲットの設定を行う
Defines Module
の設定
- Xcodeのプロジェクト設定で、ターゲットの「Build Settings」タブに移動します。
- 「Defines Module」を
Yes
に設定します。これにより、Swiftのモジュールが生成され、Objective-CコードからSwiftコードが利用できるようになります。
Install Objective-C Compatibility Header
の設定
-
フレームワークターゲットの場合、
Install Objective-C Compatibility Header
をYes
に設定します。これにより、互換性ヘッダーファイル([ProductName]-Swift.h
)が生成されます。 -
アプリケーションターゲットの場合、この設定項目は通常不要です。
Defines Module
のみで自動的に互換性ヘッダーファイルが生成されます。
3. Objective-CファイルでSwiftのヘッダーファイルをインポートする
SwiftのコードをObjective-Cから利用するには、Objective-CコードでSwift互換ヘッダーファイルをインポートする必要があります。プロジェクト名がMyProject
の場合、生成されるヘッダーファイルの名前はMyProject-Swift.h
です。
// Objective-Cファイルでのインポート例
#import "MyProject-Swift.h"
4. Objective-CからSwiftクラスやメソッドを呼び出す
上記の設定が完了すると、Objective-CコードからSwiftのクラスやメソッドにアクセスできるようになります。
MySwiftClass.swift
)
Swiftクラス (@objcMembers
class MySwiftClass: NSObject {
func greet() -> String {
return "Hello from Swift!"
}
}
```objc
#import "MyProject-Swift.h"
@implementation MyObjectiveCClass
- (void)useSwiftClass {
MySwiftClass *swiftObject = [[MySwiftClass alloc] init];
NSLog(@"%@", [swiftObject greet]);
}
@end
5. トラブルシューティング
Use of undeclared identifier
エラー
- Objective-CからSwiftクラスが見つからない場合、「Build Settings」で「Defines Module」が
Yes
になっているか確認します。 - また、Objective-Cファイルで
#import "[ProductName]-Swift.h"
が正しく行われているか確認します。
File not found
エラー
-
#import "[ProductName]-Swift.h"
のファイルが見つからない場合、ターゲット設定で「Defines Module」がYes
になっているか確認します。
まとめ
-
Swiftコードに
@objc
や@objcMembers
属性を追加してObjective-Cで利用可能にする。 -
ターゲット設定で
Defines Module
をYes
に設定し、互換性ヘッダーファイルを生成する。 -
Objective-Cファイルで
[ProductName]-Swift.h
をインポートしてSwiftクラスにアクセスする。
この設定を行うことで、Objective-CとSwiftが混在するプロジェクトで両方の言語のコードをシームレスに利用できるようになります。
Discussion