RxSwift .map Выражение было слишком сложным, чтобы его можно было решить за разумное время; рассмотрите возможность разбиения выражения на отдельные подвыражения - PullRequest
0 голосов
/ 24 апреля 2018

Как я могу решить эту проблему?В функции map он говорит, что выражение было слишком сложным, чтобы его можно было решить за разумное время;рассмотрите возможность разбиения выражения на отдельные подвыражения.

let manuallyShowFerryInBoundPopup = Observable.merge([
            NotificationCenter.default.rx
                .notification(NSNotification.Name.UIApplicationDidBecomeActive)
                .map { _ in () },
            viewDidAppear
            ])
            .flatMap { VADApi.FerryDestination.list(skip: 0, take: 1, token: VADDataManager.getUserToken()!) }
            .map { $0.first }
            .filter {
                $0 != nil
                && "\(String(($0?.ferry?.id)!)),\(String(($0?.id)!))" != VADDataManager.shownFerryInBoundTrace
            }
            .map { ( ($0?.ferry?.id)!, ($0?.id)! ) } // Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Если вы усердно работаете над тем, чтобы сделать ваш код читабельным для человека, будет очень легко сделать его читаемым компилятором.В настоящее время я не могу посмотреть на большинство этих преобразований и выяснить тип.Если мне, как человеку, трудно вывести типы, то компилятору, который уже действительно борется с выводом типов, будет еще труднее.

Как уже упоминалось в другом комментарии, явное определение типав каждом из блоков преобразования поможет.

Кроме того, при применении нескольких сложных выражений RxSwift в строке, подобной этой, я думаю, что это хорошая идея (хотя и не такая крутая / захватывающая), чтобы назначить вывод каждойпреобразование в новую переменную с четким именем.

Помните: вы не пишете машинный код или сборку.Вы пишете на языке высокого уровня.И причина №1 в том, что код может быть прочитан другими людьми.Если ваш код работает, чтобы нарушить это, вы должны пересмотреть способ написания.

0 голосов
/ 24 апреля 2018

Проблема в том, что компилятор не может понять тип результата из-за сложного кода. Определение типов результатов в ваших замыканиях поможет. Например, измените свою последнюю карту на что-то вроде этого (реальный код зависит от реальных типов, я просто сделаю предположение):

.map { data -> (String, String) in ((data?.ferry?.id)!, (data?.id)!) }

UPDATE: Если это не помогает, возможно, вы захотите добавить больше типов, указывающих на ваш код:

let manuallyShowFerryInBoundPopup: Observable<(String, String)> = Observable.merge([
            NotificationCenter.default.rx
                .notification(NSNotification.Name.UIApplicationDidBecomeActive)
                .map { _ in () },
            viewDidAppear
            ])
            .flatMap { _ -> Observable<[YourEntitiy]> in VADApi.FerryDestination.list(skip: 0, take: 1, token: VADDataManager.getUserToken()!) }
            .map { entities -> YourEntitiy in entities.first }
            .filter { entity -> Bool in
                let entityTrace = "\(String((entity?.ferry?.id)!)),\(String((entity?.id)!))"
                return entity != nil && entityTrace != VADDataManager.shownFerryInBoundTrace
            }
            .map { entity -> (String, String) in ((entity?.ferry?.id)!, (entity?.id)!) }
...