RxSwift: дополнительная удобная функция распаковки?

В настоящее время я создал функцию unwrapOptional для 9X_swift-ios безопасного развертывания необязательного 9X_swift ввода в потоке.

 func unwrapOptional(x: Optional) -> Observable { return x.map(Observable.just) ?? Observable.empty() } let aOpt: String? = "aOpt" _ = Observable.of(aOpt).flatMap(unwrapOptional).subscribeNext { x in print(x)} let aNil: String? = nil _ = Observable.of(aNil).flatMap(unwrapOptional).subscribeNext { x in print(x)} let a: String = "a" _ = Observable.of(a).flatMap(unwrapOptional).subscribeNext { x in print(x)} // output aOpt a 

То, что я хочу заархивировать, - это 9X_swift создать удобную функцию вместо использования, например, flatMap(unwrapOptional)

Observable.of(a).unwrapOptional() 

Я 9X_swift-language пытался что-то сделать, но он не компилируется 9X_swift ...

extension ObservableType { func unwrapOptional() -> RxSwift.Observable { return self.flatMap(unwrapOptional) } } 

8
0
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: RxSwift: дополнительная удобная функция распаковки?

Вы хотите, чтобы метод unwrapOptional работал только с 9X_swift1.2 наблюдаемыми объектами, имеющими необязательный 9X_swift-ios тип.

Таким образом, вам нужно каким-то образом 9X_rx-swift ограничить Element элемента Observable, чтобы он соответствовал 9X_swift-language протоколу Optional.

extension Observable where Element: OptionalType { /// Returns an Observable where the nil values from the original Observable are /// skipped func unwrappedOptional() -> Observable { return self.filter { $0.asOptional != nil }.map { $0.asOptional! } } } 

К сожалению, Swift не определяет 9X_rx-swift такой протокол (OptionalType). Так что вам также нужно 9X_swift-ios определить это самостоятельно

/// Represent an optional value /// /// This is needed to restrict our Observable extension to Observable that generate /// .Next events with Optional payload protocol OptionalType { associatedtype Wrapped var asOptional: Wrapped? { get } } /// Implementation of the OptionalType protocol by the Optional type extension Optional: OptionalType { var asOptional: Wrapped? { return self } } 

10
0

Ответ #2

Ответ на вопрос: RxSwift: дополнительная удобная функция распаковки?

оформить заказ unwrap в https://github.com/RxSwiftCommunity/RxSwift-Ext :)

или https://github.com/RxSwiftCommunity/RxOptional

На данный момент 9X_swift-ios вам следует использовать RxOptional для личных нужд 9X_swift1.2
Однако в следующие 2-3 месяца RxSwift-Ext будет расти 9X_swift-language экспоненциально :)

6
0

Ответ #3

Ответ на вопрос: RxSwift: дополнительная удобная функция распаковки?

RxSwift теперь поддерживает compactMap(). Итак, теперь 9X_swift-language вы можете делать такие вещи, как:

func unwrap(_ a: Observable) -> Observable { return a.compactMap { $0 } } 

4
0

Ответ #4

Ответ на вопрос: RxSwift: дополнительная удобная функция распаковки?

Вот версия без необходимости OptionalType (от https://stackoverflow.com/a/36788483/13000)

extension Observable { /// Returns an `Observable` where the nil values from the original `Observable` are skipped func unwrap() -> Observable where Element == T? { self .filter { $0 != nil } .map { $0! } } } 

9X_swift1.2

3
0