LoginSignup
159
157

More than 5 years have passed since last update.

[Swift] SwiftとObjective-Cで相互に連携する

Last updated at Posted at 2014-06-06

詳細は公式ドキュメント「Swift and Objective-C in the Same Project」を参照。

今後、SwiftとObjective-Cでの相互連携が当たり前になっていくのだと思います。
てなわけで、それぞれのファイルで定義したクラスにアクセスする方法をメモしておきます。

結論から書くと、それぞれBridgeとなるファイルが生成され、そこを経由してやりとりする、というのがおおまかな流れになります。

[追記]

Swiftで宣言されたprotocolをObjC側で利用する

Swiftでただ宣言しただけではブリッジ用のファイルに書き出されないため、ObjeC側で利用できません。
@objcをつけて宣言する必要があります。

protocol
@objc protocol Hoge {
    var name: String?
    func fuga()
}

利用するときは型にProtocol名をそのまま使います。

type
var aHoge: Hoge?

NSObjectを継承していないクラスをObjective-C側で利用する

Swift側でNSObjectを継承をさせると、自動的にブリッジとなるファイル<#ProductName#>-swift.hファイルが生成されます。
が、逆を返せばNSObjectを継承していないSwiftのクラスはそのブリッジのファイルに書きだされません。

しかし、@objc attributeを利用すればNSObjectを継承していなくてもObjective-C側から利用することが可能になります。
具体的には以下。

withoutNSObject.swift
@objc(SomeClass)
class SomeClass {
    // ファクトリメソッドを定義しておく
    class function create() -> SomeClass {
        return SomeClass()
    }
    func doMethod() -> () {
        println("Perform a method!")
    }
}
withoutNSObject.m
// Objective-C側での利用
SomeClass *someClass = [SomeClass create];

// インスタンスメソッドも呼べる
[someClass doMethod];

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

Objective-C側でSwiftで定義されたクラスを利用するには、Xcodeが自動生成するProjectName-Swift.hファイルをimportします。
あとは普通にObjC側から、Swiftで定義したクラスを利用することが出来ます。

TestView.swift
import UIKit;

class TestView: UIView {
    init(frame: CGRect) {
        super.init(frame: frame)
        backgroundColor = UIColor.greenColor()
    }
}
ObjcViewController.m

#import "ObjcViewController.h"

// Swift側の定義を読み込む
#import "ProjectName-Swift.h"

@interface ObjcViewController ()

// Swiftで定義したUIViewクラスを保持
@property (nonatomic, strong) TestView *testView;

@end

@implementation ObjcViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.testView = [[TestView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:self.testView];
}

@end

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

今度は逆のパターンです。
Swift内で、Objective-Cで定義したクラスを利用する方法です。
こちらのケースの方が多いのではないでしょうか。

さて、こちらもブリッジとなるヘッダファイルを介して利用します。
ただし、こちらの場合は、Swiftプロジェクト内にObjCファイルを生成しようとすると、ProjectName-Bridging-Header.hを生成しますか? と聞かれ、「はい」と答えると生成されるようです。


(公開されているAppleのサイトから引用)

このヘッダファイルに、Swift内で使用したいObjective-Cクラス用のヘッダファイルをimportさせます。

ProjectName-Bridging-Header.h
#import "ObjcViewController.h"

比較的簡単に連携できそうなのでSwiftも問題なく使えるんじゃないでしょうか。
今から楽しみです。

159
157
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
159
157