SwiftとObjective-Cは相互に呼び合えるらしい。Objective-CからSwiftはすでに記事があった。
SwiftのコードをObjective-Cから呼んでみた - Qiita
もしSwiftからObjective-Cのコードを呼べるのであれば、大抵のCocoaPodsライブラリは使い回せることになるので開発者としては大変嬉しい。せっかくなので検証にもCocoaPodsで入れたライブラリを使ってみることにした。
Swiftのプロジェクトを作る
普通に新規作成→Swiftを選んでプロジェクトを作る。なんでもいいのでSingle View Applicationあたりにしておく。
CocoaPodsでライブラリを入れる。
今回はSVProgressHUD
を使うことにした。独立しているので簡単に呼び出したりしやすい。
インストールプロセスは特に変わらない。
pod 'SVProgressHUD'
% pod install
インストール後はxcworkspace
を開くのも一緒。
Bridging-Headerを作る
Swiftで使いたいコードのヘッダーをインポートしておくためのBriding-Headerというものを作っておく必要がある。
このBriding-Headerを作るには単にヘッダーファイルを自分で持ってくるだけではどうやらいけないらしい(このあたりの仕様はまだよくわかっていません)のでXcodeに生成させる。
New FileメニューからCocoa Class
を選び、言語をObjective-Cにしてクラスを生成する。
途中でbridging header作る?って聞かれるからYES
。
すると、こういうファイルがクラスファイルと一緒にできる。
このファイルに次の一行を追加する。また、生成されたクラスは今回は不要なので削除してしまう。自前のObjective-Cクラスを追加するときなんかはそのまま使えばいい。
#import <SVProgressHUD.h>
これでSwiftから呼ぶ準備が整った。
Swiftから呼び出す
ボタンを押してプログレスの表示を切り替えるという何の実用性もないサンプルアプリケーションを考える。
スタートボタンとストップボタンとViewController.swift
ファイルをStoryboardから紐付けておき、それらのアクションの中でSVProgressHUDを呼び出す。
@IBAction func start(sender : AnyObject) {
SVProgressHUD.showWithStatus("loading...")
}
@IBAction func stop(sender : AnyObject) {
SVProgressHUD.dismiss()
}
SVProgressHUDのメソッドを直接呼ぶことができ、きちんと動作した。