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」を追加します。
これにより、ソースコード中の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"
を追加します。
#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で定義されているクラスや構造体と同じ名前は使えなくなります。
サンプルプロジェクト