Skip to content

RxSwift extensions for Swift optionals and "Occupiable" types

License

Notifications You must be signed in to change notification settings

richplanet/RxOptional

This branch is 3 commits behind RxSwiftCommunity/RxOptional:main.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
RxOptional Maintainers
Apr 14, 2022
d4f68f6 · Apr 14, 2022
Jan 15, 2021
Jan 3, 2021
Jan 4, 2021
Jan 3, 2021
Jan 3, 2021
Jan 3, 2021
Jan 15, 2021
Jan 5, 2021
Jan 3, 2021
Jan 3, 2021
Jan 3, 2021
Jan 3, 2021
Jan 3, 2021
Apr 14, 2022
Jan 3, 2021
Jan 3, 2021
Jan 3, 2021
Jan 3, 2021
Jan 3, 2021
Apr 5, 2022
Feb 4, 2016
Jan 3, 2021
Jan 3, 2021
Aug 26, 2021
Dec 26, 2019
Apr 14, 2022
Jan 5, 2021
Jan 3, 2021
Jan 4, 2021
Jan 4, 2021

Repository files navigation

RxOptional

CircleCI Version License Platform

RxSwift extensions for Swift optionals and "Occupiable" types.

Usage

All operators are also available on Driver and Signal, unless otherwise noted.

Optional Operators

filterNil
Observable<String?>
    .of("One", nil, "Three")
    .filterNil()
    // Type is now Observable<String>
    .subscribe { print($0) }
next(One)
next(Three)
completed
replaceNilWith
Observable<String?>
    .of("One", nil, "Three")
    .replaceNilWith("Two")
    // Type is now Observable<String>
    .subscribe { print($0) }
next(One)
next(Two)
next(Three)
completed
errorOnNil

Unavailable on Driver, because Drivers cannot error out.

By default errors with RxOptionalError.foundNilWhileUnwrappingOptional.

Observable<String?>
    .of("One", nil, "Three")
    .errorOnNil()
    // Type is now Observable<String>
    .subscribe { print($0) }
next(One)
error(Found nil while trying to unwrap type <Optional<String>>)
catchOnNil
Observable<String?>
    .of("One", nil, "Three")
    .catchOnNil {
        return Observable<String>.just("A String from a new Observable")
    }
    // Type is now Observable<String>
    .subscribe { print($0) }
next(One)
next(A String from a new Observable)
next(Three)
completed
distinctUntilChanged
Observable<Int?>
    .of(5, 6, 6, nil, nil, 3)
    .distinctUntilChanged()
    .subscribe { print($0) }
next(Optional(5))
next(Optional(6))
next(nil)
next(Optional(3))
completed

Occupiable Operators

Occupiables are:

  • String
  • Array
  • Dictionary
  • Set

Currently in Swift protocols cannot be extended to conform to other protocols. For now the types listed above conform to Occupiable. You can also conform custom types to Occupiable.

filterEmpty
Observable<[String]>
    .of(["Single Element"], [], ["Two", "Elements"])
    .filterEmpty()
    .subscribe { print($0) }
next(["Single Element"])
next(["Two", "Elements"])
completed
errorOnEmpty

Unavailable on Driver, because Drivers cannot error out.

By default errors with RxOptionalError.emptyOccupiable.

Observable<[String]>
    .of(["Single Element"], [], ["Two", "Elements"])
    .errorOnEmpty()
    .subscribe { print($0) }
next(["Single Element"])
error(Empty occupiable of type <Array<String>>)
catchOnEmpty
Observable<[String]>
    .of(["Single Element"], [], ["Two", "Elements"])
    .catchOnEmpty {
        return Observable<[String]>.just(["Not Empty"])
    }
    .subscribe { print($0) }
next(["Single Element"])
next(["Not Empty"])
next(["Two", "Elements"])
completed

Running Examples.playground

  • Run pod install in Example directory
  • Select RxOptional Examples target
  • Build
  • Show Debug Area (cmd+shift+Y)
  • Click blue play button in Debug Area

Requirements

Installation

RxOptional is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'RxOptional'

Add this to Cartfile

github "RxSwiftCommunity/RxOptional" ~> 4.1.0
$ carthage update

To use RxOptional as a Swift Package Manager package just add the following in your Package.swift file.

import PackageDescription

let package = Package(
    name: "ProjectName",
    dependencies: [
        .Package(url: "https://github.com/RxSwiftCommunity/RxOptional")
    ]
)

Author

Thane Gill, me@thanegill.com

License

RxOptional is available under the MIT license. See the LICENSE file for more info.

About

RxSwift extensions for Swift optionals and "Occupiable" types

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 73.0%
  • Shell 18.6%
  • Ruby 7.0%
  • Objective-C 1.4%