読者です 読者をやめる 読者になる 読者になる

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

参照

developer.apple.com