📝

SwiftライブラリをObjective-Cから利用できるようにする

2024/10/28に公開

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のStringIntなどの一部の型は自動的に変換されますが、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 HeaderYesに設定します。これにより、互換性ヘッダーファイル([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のクラスやメソッドにアクセスできるようになります。

Swiftクラス (MySwiftClass.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になっているか確認します。

まとめ

  1. Swiftコードに@objc@objcMembers属性を追加してObjective-Cで利用可能にする。
  2. ターゲット設定でDefines ModuleYesに設定し、互換性ヘッダーファイルを生成する。
  3. Objective-Cファイルで[ProductName]-Swift.hをインポートしてSwiftクラスにアクセスする。

この設定を行うことで、Objective-CとSwiftが混在するプロジェクトで両方の言語のコードをシームレスに利用できるようになります。

Discussion