ぴよログ

↓に移転したのでこっちは更新されません、多分。

SwiftからObjective-Cを呼ぶ方法。CocoaPodsも。

移転しました →

SwiftとObjective-Cは相互に呼び合えるらしい。Objective-CからSwiftはすでに記事があった。

SwiftのコードをObjective-Cから呼んでみた - Qiita

もしSwiftからObjective-Cのコードを呼べるのであれば、大抵のCocoaPodsライブラリは使い回せることになるので開発者としては大変嬉しい。せっかくなので検証にもCocoaPodsで入れたライブラリを使ってみることにした。

Swiftのプロジェクトを作る

普通に新規作成→Swiftを選んでプロジェクトを作る。なんでもいいのでSingle View Applicationあたりにしておく。

CocoaPodsでライブラリを入れる。

今回はSVProgressHUDを使うことにした。独立しているので簡単に呼び出したりしやすい。

samvermette/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のメソッドを直接呼ぶことができ、きちんと動作した。