STDevRxExt
示例
要运行 Example.playground,首先克隆仓库,然后在 Example 目录中运行 pod install
。
需求
- iOS 8.0+
- tvOS 9.0+
- macOS 10.10+
- watchOS 3.0+
- Swift 5.0+
- Xcode 11+
安装
Swift 包管理器
您可以使用 Swift 包管理器 通过向您的 Package.swift
文件添加适当的描述来安装 STDevRxExt
。
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.package(url: "https://github.com/STDevTM/STDevRxExt.git", from: "1.0.0")
]
)
接下来,按照如下方式将 STDevRxExt
添加到目标的依赖关系中
.target(
name: "YOUR_TARGET_NAME",
dependencies: [
"STDevRxExt",
]
),
然后运行 swift package update
。
所有扩展列表
过滤扩展
仅允许从 Observable<Bool>
中来的 true
元素
let disposeBag = DisposeBag()
Observable.of(true, false, false, true, true)
.allowTrue()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出将会是
true
true
true
你还可以在 Bool?
上使用 allowTrue
。在这种情况下,nil
元素将被忽略
let disposeBag = DisposeBag()
Observable.of(true, false, nil, true, nil, true)
.allowTrue()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出将会是
true
true
true
如果你希望也允许 nil
元素,则可以像这样使用 allowTrueOrNil
let disposeBag = DisposeBag()
Observable.of(true, false, nil, true, nil, true, false)
.allowTrueOrNil()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出将会是
true
true
true
true
true
映射扩展
你可以使用提供的值映射序列中的每个元素。
let disposeBag = DisposeBag()
Observable.of(1, 5, 7, 8)
.map(to: "ping")
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出将会是
ping
ping
ping
ping
你可以通过提供的关键路径映射序列中的每个元素。
let disposeBag = DisposeBag()
let observable = Observable.of(
Book(title: "Twenty Thousand Leagues Under the Sea", author: Author("Jules", "Verne")),
Book(title: "Hamlet", author: Author("William", "Shakespeare")),
Book(title: "Hearts of Three", author: Author("Jack", "London"))
)
observable
.map(at: \.title)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
observable
.map(at: \.author.firstName)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出将会是
Twenty Thousand Leagues Under the Sea
Hamlet
Hearts of Three
Jules
William
Jack
转换扩展
你可以使用 cast(to:)
方法按顺序进行向下转换。
let disposeBag = DisposeBag()
Observable<CustomStringConvertible>.of("1", "5", "7", "8")
.cast(to: String.self)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出将会是
Optional("1")
Optional("5")
Optional("7")
Optional("8")
为了强制转换,请使用 forceCast(to:)
,如下所示
let disposeBag = DisposeBag()
Observable<CustomStringConvertible>.of("1", "5", "7", "8")
.forceCast(to: String.self)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出将会是
1
5
7
8
在向下转换异常的情况下,它将返回 Observable.error(RxCastError.castFailed)
。
除了 forceCast(to:)
之外,允许扩展函数也可以用于 Driver
。
其他扩展
有时我们需要在每个 Observable
或 Driver
的 next
事件上更新一些主题或观察者。例如
request
.do(onNext: { [weak self] _ in
self?.inProgress.onNext(true)
})
.flatMap {
service.doRequest($0)
}
.do(onNext: { [weak self] _ in
self?.inProgress.onNext(false)
})
.subscribe(onNext: { response in
dump(response)
})
.disposed(by: disposeBag)
你可以使用 update(_:with:)
方法来缩短代码,如下所示
request
.update(inProgress, with: true)
.flatMap {
service.doRequest($0)
}
.update(inProgress, with: false)
.subscribe(onNext: { response in
dump(response)
})
.disposed(by: disposeBag)
作者
哈巴祖扬·提格兰,[email protected]
支持
请随时提交问题,包括建议、错误报告、功能请求、疑问。
告诉我们!
如果您在有使用我们组成部分的项目中发送链接,我们将非常高兴。只需发送电子邮件到[email protected]。如果您有任何问题或建议,也请告知我们。
许可
STDevRxExt遵循MIT许可证。更多信息请参阅LICENSE文件。