読者です 読者をやめる 読者になる 読者になる

SwiftからObjective-Cのライブラリ使う

SwiftiOSアプリ書くのはすっきりとした文法で快適なのですが、凝ってはいるけど定番な動きを実現したいときには誰かが作ってくれた部品を使いたくなります。Githubにもそれはそれは多くのiOS向けのOSSがありますし、大抵はMITライセンスなので仕事でも使い易い。しかしこれらは現在ほとんど全てがSwiftではなくObjective-Cソースコードで提供されています。そのうちSwiftのものも増えてくるでしょうけど今はObjective-Cだけ。

SwiftからObjective-Cを使おうとしたとき、承前としてまず読むべきなのは以下のドキュメント。私はXCodeを開いたMBPの傍ら、iPad miniiBookに落として読んでます。

一瞬ハマりました。いきなりこのドキュメントにあるダイアログ(「Would you like to configure an Objective-C bridging header?」と聞かれるやつ)が出ないんですよ。。。何度かプロジェクトを作り直したりしたのですが、どうにも説明どおりにならない。では、ということでドキュメントの続く部分に書かれた以下の記述をなぞります。

Alternatively, you can create a bridging header yourself by choosing File > New > File > (iOS or OS X) > Source > Header File.

ここで作るブリッジヘッダファイルの名前は実はなんでもいい。ドキュメントの先の部分では「your product module name followed by adding "-Bridging-Header.h"」とか書かれているけどそんなの長いしイヤ。この取り込み用のものの他にヘッダファイルを作る予定も無いのでダイアログデフォルトの「Header.h」でいいんじゃない?で大事なのはさらに続く以下の記述。

Under Build Settings, make sure the Objective-C Bridging Header build setting under Swift Compiler - Code Generation has a path to the header. The path should be relative to your project, similar to the way your Info.plist path is specified in Build Settings. In most cases, you should not need to modify this setting.

Swift Compiler - Code Generation > Objective-C Bridging Header」にプロジェクト相対パスで作ったヘッダファイルを設定する。実はOSファイルシステム上の絶対パス指定でもオッケーです。可搬性かんがえたら相対パス指定にしますけどね。これのスクリーンショットはこんな感じです。プロジェクトファイルの該当箇所が見つからなくて時間かかった。

f:id:masataka_k:20141016073521p:plain

あとはドキュメントの手順にある、Objective-Cの使いたいヘッダファイル名を作成したブリッジヘッダファイルに追加してあげればよい。ここまでやるといきなりクラスが見えるようになります!DrawerSampleってのはFacebook風のドロワーコントローラで何使ったらいいかを試しているところだったので。これからMMDrawerControllerとECSlidingViewControllerの両方を書いてみてよさそうな方を使いたいと思います。

#ifndef DrawerSample_Header_h
#define DrawerSample_Header_h

#import "MMDrawerController.h"

#endif

やれやれ。なんでブリッジヘッダファイルを自動生成するダイアログが出なかったのだろう?汚れちゃってるのかな?Yosemiteでたら速攻でクリーンインストールしようと思ってます。