Игнорирование/фильтрация ноль

Есть ли оператор, который может фильтровать nil? Самое близкое, что я нашел, это решение, упомянутое здесь: https://github.com/ReactiveX/RxSwift/issues/209#issuecomment-150842686

Соответствующий отрывок:

public protocol OptionalType {
    func hasValue() -> Bool
}

extension Optional: OptionalType {
    public func hasValue() -> Bool {
        return (self != nil)
    }
}

public extension ObservableType where E: OptionalType {
    @warn_unused_result(message="http://git.io/rxs.uo")
    public func notNil() -> Observable<E> {
        return self.filter { $0.hasValue() }
    }
}

Однако после .notNil() E по-прежнему является необязательным, поэтому последующие связанные операторы по-прежнему видят self как Observer<E>, где E является необязательным. Поэтому мне все еще нужен дополнительный оператор, который делает:

.map { (username: String?) -> String in
    return username!
}

Я должен что-то упустить. Кажется, это очень распространенная потребность.


person solidcell    schedule 11.04.2016    source источник


Ответы (3)


оформить заказ unwrap по адресу https://github.com/RxSwiftCommunity/RxSwift-Ext :)

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

На данный момент вы должны использовать RxOptional для своих личных нужд
Однако RxSwift-Ext будет расти в геометрической прогрессии в ближайшие 2-3 месяца :)

P/S: эти ребята (я говорю о владельцах этих репозиториев) ежедневно общаются друг с другом на RxSwift в слаке :)

person Pham Hoan    schedule 12.04.2016

В RxSwift 5 можно использовать compactMap из основной библиотеки:

observable.compactMap { $0 }
person Lion    schedule 27.06.2019

  • Чтобы отфильтровать значения nil, используйте RxSwiftExt.unwrap().
  • И чтобы отфильтровать только значения nil, просто сделайте следующее:
observableContainingNils.filter { $0 == .none }
person Al___    schedule 13.01.2021