Objective-C で定義したクラスを Swift で利用する : Swift プログラミング

PROGRAM


Objective-C で定義したクラスを Swift で利用する

Objective-C と Swift とでは、それぞれで定義したクラスを簡単に相互利用できるようになっています。

ここでは Objective-C で定義したクラスを Swift で利用する方法を紹介します。Swift で定義したクラスを Objective-C で利用する方法については Swift で定義したクラスを Objective-C で利用する で紹介します。

Objective-C のクラスを Swift で利用できるようにするための準備

ブリッジヘッダーファイルを用意する

Objective-C のクラスを Swift から利用できるようにするためには、どの Objective-C クラスを Swift で利用するかを記載したブリッジヘッダーファイルをプロジェクト内に用意する必要があります。

このブリッジヘッダーファイルは一般的に "$(TARGET_NAME)-Bridging-Header.h" という名前のファイルが使われます。ここの "$(TARGET_NAME)" のところは、具体的なターゲットの名前を記載します。

記載方法は Objective-C のヘッダーファイルと同じですが、通常は "#import" を使って、他のヘッダーファイルで定義した Objective-C クラスを取り込むようにするのが良いでしょう。ブリッジヘッダーファイル内で新しいクラスを定義することもできますが、@implementation を記載しても上手くいかないようなので、それとは別に実装ファイルも必要になります。

 

そして、ブリッジヘッダーファイルが Swift に取り込まれるように、ターゲット設定の Build Settings 設定に登録しておきます。

Build Settings 設定には "Swift Compiler - Code Generation" カテゴリがあるので、その中の "Objective-C Bridging Header" のところに "$(TARGET_NAME)/$(TARGET_NAME)-Bridging-Header.h" のように記載することで、このファイルがブリッジヘッダーファイルとして使用されるようになります。

 

Swift で利用する Objective-C クラスをブリッジヘッダーファイルに記載する

ブリッジヘッダーファイルを用意できたら、その中に Swift で利用したい Objective-C クラスが定義されているファイルを #import 文で記載します。

たとえば "EzObject.h" ファイルで定義されているクラスを Swift でも使用したい場合、これを "$(TARGET_NAME)-Bridging-Header.h" でインポートします。

#import "EzObject.h"

こうすることで、ここで記載した Objective-C クラスが Swift で利用できるようになります。

Objective-C クラスを使用する

たとえば、次のような Objective-C クラスが "EzObject.h" ヘッダーで定義されていたとします。

@interface EzObject : NSObject

 

@property (readwrite,strong) NSString *name;

@property (readwrite,strong) NSString *note;

 

- (id)initWithName:(NSString*)name;

- (id)initWithName:(NSString*)name note:(NSString*)note;

 

@end

このようなとき、ブリッジヘッダーファイルで "EzObject.h" をインポートしておけば、このクラスを Swift コード内ですぐに利用できます。

// 特別な実装をしなくても Swift の流儀でインスタンスを生成できます。

var obj = EzObject(name: "OBJ", note:"ObjC")

 

// 生成したインスタンスは Swift と変わらない方法で利用できます。

NSLog("%@", obj.name)

Objective-C での init メソッドの実際の定義は "initWithName:note:" という名前のメソッドですが、これをブリッジヘッダーファイルを使って Swift で利用するときには自動で Swift らしいメソッド名に調整されています。

通常のインスタンスメソッドの場合は、たとえば "textWithString:" のようなメソッドは "textWithString(str)" という形で呼び出すことになるようです。また、引数を 2 つ取るような "textWithString:string:" というメソッドの場合は "textWithString(str1, string:str2)" というような呼び出し方になるようです。

Objective-C クラスを Swift で継承する

Swift にインポートした Objective-C クラスは、そのまま継承して新しい Swift クラスを定義できるようです。

継承方法は Swift クラスを継承するときと同じ方法で記載できます。

class EzSwiftObject : EzObject

{

override func textWithString(string: String) -> String

{

return super.textWithString(string)

}

}

[ もどる ]