Reactive Programming in Swift
Swift Objective-C Other
Failed to load latest commit information.
.github Fix incorrect Slack URL in GitHub Issue template Nov 2, 2016
Documentation Added information on enabling debug mode Dec 29, 2016
Platform Improves hiding of Bag as implementation detail. Nov 6, 2016
Preprocessor Adds unit test to ensure sequence resources will be cleaned on termin… Jan 1, 2017
Rx.playground Update SupportCode of Rx.playground Dec 14, 2016
Rx.xcodeproj [Fix] Adds proper resource cleanup detection for `ifEmpty(default:). Jan 15, 2017
Rx.xcworkspace [Fix] Removes API reference. Dec 27, 2016
RxBlocking make final all posibles classes Jan 6, 2017
RxCocoa [Fix] Removes final from delegate proxies. Jan 8, 2017
RxExample Merge pull request #1055 from gorozco58/master Jan 14, 2017
RxSwift Removes redundant comment from `Producer.swift`. Jan 15, 2017
RxTest [Fix] Removes `final`. Jan 8, 2017
Sources Run ./scripts/package-spm.swift Jan 4, 2017
Tests [Fix] Adds proper resource cleanup detection for `ifEmpty(default:). Jan 15, 2017
assets Adds proper attribution to Rx Logo and license (at least I think it d… May 19, 2015
scripts Improves package-spm script to exclude additional tests that aren't a… Jan 1, 2017
.gitignore RxSwift compiles first time on Linux. Dec 26, 2015
.jazzy.yml Add `ifEmpty(default:)` operator to changeling Jan 3, 2017
.swift-version Adds `.swift-version`. Oct 20, 2016
.travis.yml Hopefully improves Travis stability. Oct 30, 2016 Add `ifEmpty(default:)` operator to changeling Jan 3, 2017 Fixes contact info. May 21, 2016 Improves Jun 26, 2016
Dangerfile Adds `swift-3.0` as valid branch in Dangerfile. Jul 10, 2016
Gemfile Danger base setup Jun 3, 2016
Gemfile.lock Danger base setup Jun 3, 2016 Standardizes header format. Dec 29, 2015
Package.swift Removes RxTest from OSX + SPM until real XCTest support on OSX. Oct 22, 2016 [Fix] Adds `isEmpty` guard. Dec 17, 2016
RxBlocking.podspec Adds .0 to podspecs. Dec 28, 2016
RxCocoa.podspec Adds .0 to podspecs. Dec 28, 2016
RxSwift.podspec Adds .0 to podspecs. Dec 28, 2016
RxTest.podspec Adds .0 to podspecs. Dec 28, 2016

Miss Electric Eel 2016 RxSwift: ReactiveX for Swift

Travis CI platforms pod Carthage compatible Swift Package Manager compatible

About Rx

⚠️ This readme describes RxSwift 3.0 version that requires Swift 3.0.

⚠️ If you are looking for Swift 2.3 compatible version, please take a look at RxSwift ~> 2.0 versions and swift-2.3 branch.

Rx is a generic abstraction of computation expressed through Observable<Element> interface.

This is a Swift version of Rx.

It tries to port as many concepts from the original version as possible, but some concepts were adapted for more pleasant and performant integration with iOS/macOS environment.

Cross platform documentation can be found on

Like the original Rx, its intention is to enable easy composition of asynchronous operations and event/data streams.

KVO observing, async operations and streams are all unified under abstraction of sequence. This is the reason why Rx is so simple, elegant and powerful.

I came here because I want to ...

... understand
... install
... hack around
... interact
... compare
... find compatible
... see the broader vision
  • Does this exist for Android? RxJava
  • Where is all of this going, what is the future, what about reactive architectures, how do you design entire apps this way? Cycle.js - this is javascript, but RxJS is javascript version of Rx.


Here's an example In Action
Define search for GitHub repositories ...
let searchResults = searchBar.rx.text.orEmpty
    .throttle(0.3, scheduler: MainScheduler.instance)
    .flatMapLatest { query -> Observable<[Repository]> in
        if query.isEmpty {
            return .just([])

        return searchGitHub(query)
... then bind the results to your tableview
    .bindTo(tableView.rx.items(cellIdentifier: "Cell")) {
        (index, repository: Repository, cell) in
        cell.textLabel?.text =
        cell.detailTextLabel?.text = repository.url


  • Xcode 8.0
  • Swift 3.0


Rx doesn't contain any external dependencies.

These are currently the supported options:


Open Rx.xcworkspace, choose RxExample and hit run. This method will build everything and run the sample app


Tested with pod --version: 1.1.1

# Podfile

target 'YOUR_TARGET_NAME' do
    pod 'RxSwift',    '~> 3.0'
    pod 'RxCocoa',    '~> 3.0'

# RxTests and RxBlocking make the most sense in the context of unit/integration tests
    pod 'RxBlocking', '~> 3.0'
    pod 'RxTest',     '~> 3.0'

Replace YOUR_TARGET_NAME and then, in the Podfile directory, type:

$ pod install


Tested with carthage version: 0.18.1

Add this to Cartfile

github "ReactiveX/RxSwift" ~> 3.0
$ carthage update

Swift Package Manager

Tested with swift build --version: 3.0.0 (swiftpm-19)

Create a Package.swift file.

import PackageDescription

let package = Package(
    name: "RxTestProject",
    targets: [],
    dependencies: [
        .Package(url: "", majorVersion: 3)
$ swift build

Manually using git submodules

  • Add RxSwift as a submodule
$ git submodule add
  • Drag Rx.xcodeproj into Project Navigator
  • Go to Project > Targets > Build Phases > Link Binary With Libraries, click + and select RxSwift-[Platform] and RxCocoa-[Platform] targets