LoginSignup
5
5

More than 5 years have passed since last update.

RxSwiftをiOS 7で使う

Last updated at Posted at 2016-05-24

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の違い

  1. RxSwiftとRxCocoaのソースコードがプロジェクトに追加されている
  2. import RxSwiftimport RxCocoaを無効にするフラグをつけてビルドされている
  3. 一部の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

これにより、ソースコード中のimport RxSwiftimport 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

RxSwift-iOS7-Bridging-Header.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で定義されているクラスや構造体と同じ名前は使えなくなります。

サンプルプロジェクト

5
5
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5