【问题标题】:RxSwift .map Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressionsRxSwift .map 表达式过于复杂,无法在合理的时间内解决;考虑将表达式分解为不同的子表达式
【发布时间】:2018-04-24 12:59:10
【问题描述】:

我该如何解决这个问题?在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

【问题讨论】:

    标签: swift xcode rx-swift


    【解决方案1】:

    问题是由于代码复杂,编译器无法理解结果类型。在闭包中指定结果类型会有所帮助。例如将你的最后一张地图改成这样(实际代码取决于实际类型,我只是做一个假设):

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

    更新: 如果这没有帮助,您可能需要在代码中添加更多类型指定:

    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)!) }
    

    【讨论】:

    • 这不起作用,我仍然有同样的错误。
    【解决方案2】:

    如果您努力使您的代码具有人类可读性,那么使其具有编译器可读性将是一件轻而易举的事。就目前而言,我无法查看大多数这些转换并找出类型。如果作为人类推断类型对我来说很难,那么已经在类型推断方面陷入困境并陷入困境的编译器将更加困难。

    正如另一条评论中提到的,在每个转换块中明确类型会有所帮助。

    此外,当像这样连续应用多个复杂的 RxSwift 表达式时,我认为将每个转换的输出分配给一个新的、明确命名的变量是一个好主意(虽然不是那么酷/令人兴奋)。

    请记住:您不是在编写机器代码或汇编代码。你正在用高级语言写作。这样做的第一个原因是代码可以被其他人阅读。如果你的代码违反了这一点,你应该重新评估它的编写方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      相关资源
      最近更新 更多