Swift の Class, Protocol を Objective-C で使う
Objective-C 側で ProjectName-Swift.h を import すれば使えるでしょとか思っていたのですが、すんなり使えなかったので書いておきます。
Class を使う
SampleObjcClass.h と SampleObjcClass.m からなる Objective-C のクラス内で、 Swift で書かれた SampleSwiftClass を使いたいとします。 この方法は、ヘッダファイル (.h) と インプリメンテーションファイル (.m) で違います。
インプリメンテーションファイルでは、ProjectName-Swift.h を import するだけで大丈夫です。
// SampleObjcClass.m #import "ProjectName-Swift.h" @implementation SampleClass @end
ヘッダファイルの場合は、対象のクラスを class で宣言することで呼び出せるようになります。
// SampleObjcClass.h @class SampleSwiftClass @interface SampleObjectiveCClass @end
継承する
Objective-C のクラスで Swift のクラスを継承することはできないようです。
そのため、 Swift のクラスを継承したいときは Objective-C のクラスを Swift に書き換える必要があります。何か別の方法あったら教えていただきたいです、、、
Protocol を使う
先ほど同様、 SampleObjcClass.h と SampleObjcClass.m からなる Objective-C のクラス内で、 Swift で書かれた SampleSwiftProtocol を使いたいとします。
この場合、 Swift 側で SampleSwiftProtocol の定義に @objc を付ける必要があります。
// SampleSwiftProtocol.swift @objc protocol SampleSwiftProtocol { }
Objective-C 側は、クラスの場合と同様にインプリメンテーションファイルでは、ProjectName-Swift.h を import するだけで大丈夫です。
// SampleObjcClass.m #import "ProjectName-Swift.h" @implementation SampleClass () @end
ヘッダファイルの場合は、対象のプロトコルを @protocol で宣言することで呼び出せるようになります。
// SampleObjcClass.h @protocol SampleSwiftProtocol @interface SampleObjectiveCClass @end
適用する
適用する定義は、インプリメンテーションファイルにて記述する必要があるようです。ヘッダファイルではエラーとなってしまいます。
// SampleObjcClass.m #import "ProjectName-Swift.h" @implementation SampleClass () <SampleSwiftProtocol> @end
// SampleObjcClass.h @protocol SampleSwiftProtocol // エラーになる @interface SampleObjectiveCClass <SampleSwiftProtocol> @end