Неожиданное значение nil для карты RxSwift> подписка - PullRequest
0 голосов
/ 18 мая 2018

Это всего лишь образец.

Но я могу понять такое поведение. Почему, во-первых, переменная не является необязательной, а в последней - необязательной.

let tapEvent: ControlEvent<UITapGestureRecognizer> = chargingView.rx.tapGesture()
            tapEvent.map { _ in
                return CGPoint()
                }.filter { $0 != nil }.map { $0 } // here Comparing non-optional value of type 'CGPoint' to nil always returns true
                .subscribe { point in
                    print(point.element) // Expression implicitly coerced from 'CGPoint?' to Any
                }.disposed(by: bag)

Скриншот для доказательства.

enter image description here

То же поведение для этого похожего кода

let tapEvent: ControlEvent<UITapGestureRecognizer> = chargingView.rx.tapGesture()
            tapEvent.map { _ in
                return CGPoint()
                }.flatMap { Observable.from(optional: $0) }
                .subscribe { point in
                    print(point.element)

Я не знаком с RX. Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

В первом случае входной параметр оператора фильтра является необязательным CGPoint.Поскольку он не является обязательным, его нельзя сравнить с nil.

Во втором случае .flatMap { Observable.from(optional: $0) } выравнивает Observable<Observable<CGPoint>> до Observable<CGPoint>

В Swift это эквивалентно следующему:

let arrayOfArrays = [[1,2,3,4]]
let array = arrayOfArrays.flatMap{$0} //Output: [1,2,3,4]
0 голосов
/ 18 мая 2018

Давайте разберемся:

let pointArray = tapEvent.map { return CGPoint() }
let filteredArray = pointArray.filter { $0 != nil }
let newPointArray = filteredArray.map { $0 }
let subscribed = newPointArray.subscribe { point in
    print(point.element)
}
subscribed.disposed(by: bag)

Это может быть не на 100% идеально, но достаточно для некоторых разъяснений.

pointArray будет массивом необязательных, пустых CGPoint значений.

Поскольку они не являются обязательными, фильтр для удаления значений nil не имеет смысла и является причиной первой ошибки. Просто исключите filter.

Затем вы отображаете объекты в filteredArray на себя. Опять же, это бессмысленно. Уберите вторую карту.

Вторая ошибка связана с point.element. Я ничего не знаю о RxSwift и об этом конкретном методе, основанном на предупреждении, параметр point замыкания является необязательным. Возможно, вам нужно добавить ? перед ..

При всем этом ваш код становится:

let pointArray = tapEvent.map { return CGPoint() }
let subscribed = pointArray.subscribe { point in
    print(point?.element)
}
subscribed.disposed(by: bag)

Или написано в оригинальном формате:

let tapEvent: ControlEvent<UITapGestureRecognizer> = chargingView.rx.tapGesture()
tapEvent.map { return CGPoint() }
    .subscribe { point in
        print(point?.element)
    }.disposed(by: bag)

Имеет ли смысл выполнить оставшиеся map как есть, я понятия не имею. Кажется странным, но опять же, я не знаю RxSwift.

...