前回はNSObjectから派生したSwiftのクラスをObjective-Cで使うための方法を紹介しました。
Swiftは親クラスを持たないクラスを作る事も出来ます。その場合には気をつけなければいけない事があります。
@objc(<#name#>)
まず、クラスの宣言の前に@objc(<#name#>)を付けて、Objective-Cから<#name#>というクラス名で使用出来るようにしなければなりません。マニュアルによると@objc(<#name#>)はSwiftで宣言したのとは違うクラス名でアクセス出来るようにも出来ると書かれているのですが実際に試してみると上手くいきません。とりあえず問題はありませんのでクラス名にします。
alloc, init
Objective-Cでクラスを扱う際には全てのクラスはNSObjectのサブクラスになります。従ってインスタンス化する時には
以下のようにしていました。
OneClass* obj; obj = [OneClass alloc]; obj = [obj init];
しかしこのような方法でNSObjectを親クラスに持たないクラスをインスタンス化する事は出来ません。なぜならallocとinitはどちらもNSObjectクラスのメソッドだからです。
ではどうするか?
Swiftのクラスにクラス・メソッドを作ってやり、その中でクラスのインスタンスを返してやります。
import Foundation @objc(SwiftClass02) class SwiftClass02 { class func create() -> SwiftClass02 { return SwiftClass02() } }
#import "ObjectiveC-Class.h" #import "Swift03-Swift.h" @implementation ObjectiveC_Class -(void)method { SwiftClass02* swiftClass02; swiftClass02 = [SwiftClass02 create]; } @end
次はSwiftの中でObjective-Cのクラスを使う方法を考えてみます。
Leave a Reply