Objective-CベースのプロジェクトからSwiftのクラスを呼び出す

More than 1 year has passed since last update.

やり方

Objective-CベースのプロジェクトでSwiftのNSObjectを継承したクラスのコードを新規作成し、ビルドすると<# ProductName #>-Swift.hがプロジェクトに一つ自動的に作られる。

それをObjCからimportするだけでクラスが使えるようになる

#import "<# ProductName #>-Swift.h"

  • ProductNameはSampleとする
  • Swiftで作成するのはAccontクラスとする

Swift側

import Foundation

class Account : NSObject {

    //twitterIDを保持
    let twitterId: Int64

    init(twitterId: Int64) {
        self.twitterId = twitterId   
    }    
}

Objective-C側。Swiftのクラスを使いたい

#import "Sample-Swift.h"
Account *account = [[Account alloc] initWithTwitterId:9791362];

その他

<# ProductName #>-Swift.hについて

  • <# ProductName #>-Swift.hはどこにあるのかわからないがそれでいい
  • <# ProductName #>-Swift.hはSwift側のクラスにメソッドを追加するなどした場合、ビルド後に自動的にそれが反映されている
    • そのためgitなどで管理したりメンバーに共有しなくても良い

下記に"Sample-Swift.h"の自動生成された内容一部抜粋。Objective-Cから利用されることが理解できる。

@interface Account : NSObject
@property (nonatomic, readonly) int64_t twitterId;
- (instancetype)initWithTwitterId:(int64_t)twitterId OBJC_DESIGNATED_INITIALIZER;
@end

自動生成された結果はXcode6.1とSwift1.1に依存しているはず。前のバージョンではこのように分かりやすくなかった気がする。