以前記事の所々に出現していたBridgingHeaderについて紹介します。

書く書く詐欺はよくないので、知識がホットなうちに記事にして固めようという魂胆です。

BridgingHeaderについての簡単な紹介と使い方について書きます。

Bridging-Headerについて

ご存知の通り、AppleさんはiOS8やXcodeとともにSwiftもリリースしました。

Beta版の頃からiOS界隈はSwiftに大盛り上がりしていました。

あの長ったらしいメソッド名を書かなくてすむとかスクリプト言語っぽいとか(ちなみに僕はScalaちっくだなって思いました。)。

しかし、世に出ているライブラリのほとんどはまだObjective-Cで作られているのが現状です。

なのでSwiftでもObjective-C製のライブラリを使いたいとか、ここはObjective-Cで書きたいとかという問題の解決策がBridgingHeaderというものです。

公式リファレンスでは「Objective-CSwiftを単一のプロジェクトで共存させるためのもの」と表現されていました。

ということで、このBridging-Headerを使って、Objective-CSwiftを共存させたプロジェクトを作成する方法を紹介します。

使うクラスの紹介

こんなクラスを用意しました。

NASwiftClass.swift
1
2
3
4
5
6
7
8
9
10
import UIKit
class NASwiftClass: NSObject {
var name: String = "";
init(name: String) {
self.name = name
}
func greeting() -> String {
return "Hello \(self.name) !!! Is NASwiftClass."
}
}
NAObjectiveCClass.h
1
2
3
4
5
6
#import <Foundation/Foundation.h>
@interface NAObjectiveCClass : NSObject
@property (nonatomic, copy) NSString *name;
- (id)initWithName:(NSString *)name;
- (NSString *)greeting;
@end
NAObjectiveCClass.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import "NAObjectiveCClass.h"
@implementation NAObjectiveCClass
- (id)initWithName:(NSString *)name
{
self = [super init];
if (self) {
self.name = name;
}
return self;
}
- (NSString *)greeting
{
return [NSString stringWithFormat:@"Hello %@ !!! Is NAObjectiveCClass.", self.name];
}
@end

このクラスたちを別々に使ってみます。

Importing Objective-C into Swift

実はSwiftのプロジェクトでObjectiveCのクラスを作成しようとするとAlertが出てきて、XcodeがBridging-Headerのファイルを作成してくれます。

しかし、Objective-Cで作成されたライブラリを追加するだけではBridging-Headerは勝手に追加されないので、ここで作り方と設定方法を紹介します。

Bridging-Headerの作り方

とっても簡単です。

ヘッダーファイルを作成するだけです。

ScreenShot24

ファイル名はXcodeさんだと${ProductModuleName}-Bridging-Header.hというファイル名にしているのでこれにならうのがいいかと思います。

今回僕はサンプルでSampleBridgingHeaderというプロジェクトを作成したので、Bridging-Headerのファイル名はSampleBridgingHeader-Bridging-Header.hになります。

Bridging-Headerの設定方法

とっても分かりにくい所にありますが、検索を使えば一発です。

スクショを参考にしてみてください。

ScreenShot25

これで設定は完了です。

次にSwiftからObjective-Cのクラスを使うためにBridging-Headerを編集します。

import文の追加

Swift側で使いたいObjective-C製のクラスのヘッダーファイルをimportします。

SampleBridgingHeader-Bridging-Header.h
1
#import "NAObjectiveCClass.h"

これだけでObjective-Cのクラスを使えるようになります。

使ってみる

こんなViewController.swiftを用意しました。

ViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var greetingLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let objectiveCClass: NAObjectiveCClass = NAObjectiveCClass(name: "Ninja")
greetingLabel.text = objectiveCClass.greeting()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}

これを実行すると以下のスクショみたいになります。

ScreenShot26

これで使えたことが確認できたと思います。

他のライブラリやクラスを使いたい場合はBridgingHeaderimport文を追加するだけですみます。

Importing Swift into Objective-C

Objective-CからSwiftのクラスを使うのはとっても簡単です。

Swiftで出来たクラスを使いたいObjective-C.mファイルで以下のimport文を追加するだけですみます。

1
#import "${ProductModuleName}-Swift.h"

使ってみる

ということでこんなViewControllerを用意しました。

NAViewController.h
1
2
3
#import <UIKit/UIKit.h>
@interface NAViewController : UIViewController
@end
NAViewController.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import "NAViewController.h"
#import "SampleBridgingHeader-Swift.h"
@interface NAViewController ()
@property (weak, nonatomic) IBOutlet UILabel *greetingLabel;
@end
@implementation NAViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
NASwiftClass *switfClass = [[NASwiftClass alloc] initWithName:@"Ninja"];
self.greetingLabel.text = [switfClass greeting];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end

すると以下のスクショみたいになります。

ScreenShot27

まとめ

  • Importing Objective-C into Swift
    • ${ProductModuleName}-Bridging-Header.hの作成
    • BuildSettingsにてBridgingHeaderファイルを指定する
  • Importing Swift into Objective-C
    • .mファイルで#import "${ProductModuleName}-Swift.h"をする

という感じです。

そうするとちょっと無駄に書いた感がしますが、その感情はおいておきます。

あと補足ですが、BridgingHeaderファイルは1つしか指定できません。

なので、他のライブラリにあるやつを設定するよりは自分で作成して設定しての方がわかりやすいと思います。

一瞬で設定できるので、配布されているやつを使うより自分で作成することをおすすめします!

終わりに

Swift、悪くないなと思ってきました。

この記事のサンプルはNinjaAdMax/SampleBridgingHeaderにおいておきました。

以上になります。

参考

Using Swift with Cocoa and Objective-C: Swift and Objective-C in the Same Project