RxSwiftに付属のサンプルプロジェクト「RxExample」にはiOS版とOS X版があって、その中の一つにDynamic Framework(その用途からEmbedded Frameworkとも呼ばれる)ではなく、RxSwiftのソースコードを直接プロジェクトに追加する形で構成されている「RxExample-iOS-no-module」というターゲットがあります。
そこで用いられているやり方を使って、RxSwiftをDynamic Framework非対応のiOS 7で使ってみます。
RxExample-iOSとRxExample-iOS-no-moduleの違い
- RxSwiftとRxCocoaのソースコードがプロジェクトに追加されている
-
import RxSwift
やimport RxCocoa
を無効にするフラグをつけてビルドされている - 一部のObjective-CのコードをBridging Headerで読み込んでいる
これらをDeployment TargetがiOS 7向けのターゲットに適用していきます。
1. RxSwiftとRxCocoaのソースコードをプロジェクトに追加する
RxSwiftからソースコードをチェックアウトして、RxSwiftフォルダ以下とRxCocoaフォルダ以下を丸ごとプロジェクトに追加します。そのときiOS 7向けのターゲットに含まれるようにします。
そのうち、RxCocoa/OSXフォルダ以下は必要ない(というか、あるとビルドできない)のでプロジェクトから削除するか、ターゲットから外します。
2. 「Other Swift Flags」に「-D RX_NO_MODULE」を追加する
ターゲットの「Other Swift Flags」に「-D RX_NO_MODULE」を追加します。
![Screen Shot 2016-05-25 at 00.09.22.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F31516%2F08085e99-9f2d-da97-0c6a-19be730308dc.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e9d7d299934851fdb3e80ed669acdabd)
これにより、ソースコード中のimport RxSwift
やimport RxCocoa
が無視されるようになり、名前空間に依存している箇所も解消されます。
3. RxCocoa.hをBridging Headerで読み込む
RxCocoaの一部はObjective-Cで実装されているため、それらをSwiftのプロジェクトでも使えるようにする必要があります。
RxCocoa/RxCocoa.hへのパスを直接「Objective-C Bridging Header」に指定するか、既存または新規のBridging Headerに#import "RxCocoa.h"
を追加します。
![Screen Shot 2016-05-25 at 00.13.28.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F31516%2Fc934e621-ccc0-4522-d349-1c615db11db2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=8c74198a2b9c5684afbb97daf72e3bd9)
#import "RxCocoa.h"
4. RxSwiftやRxCocoaを使ったコードを書いてiOS 7で実行してみる
ここまでやるとRxSwiftやRxCocoaが使えるようになっているはずです。直接ソースコードを取り込んでいるのでimport RxSwift
などはする必要がありません。
ビルドが無事通り、iOS 7の端末でも動くか確認しましょう。当然ですが、UISearchController+Rx.swift
など、iOS 8から使えるようになったクラスや機能のRx拡張は使えないので、そこだけ注意してください。
Dynamic Frameworkを使わないことによるデメリット
Dynamic Frameworkが提供していた名前空間がなくなるので、RxSwiftで定義されているクラスや構造体と同じ名前は使えなくなります。
サンプルプロジェクト