Awesome
RxOptional
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 Driver
s 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 Driver
s 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
CocoaPods
RxOptional is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'RxOptional'
Carthage
Add this to Cartfile
github "RxSwiftCommunity/RxOptional" ~> 4.1.0
$ carthage update
Swift Package Manager
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.