RxSwift .map表达式太复杂,无法在合理的时间内解决;考虑将表达式分解为不同的子表达式

时间:2018-04-24 12:59:10

标签: swift xcode rx-swift

我该如何解决这个问题?在if #available(iOS 11.0, *) { myView.layer.maskedCorners = [.layerMinXMinYCorner,.layerMaxXMinYCorner] } else { myView.maskByRoundingCorners([.topLeft, .topRight]) } extension UIView{ func maskByRoundingCorners(_ masks:UIRectCorner, withRadii radii:CGSize = CGSize(width: 10, height: 10)) { let rounded = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: masks, cornerRadii: radii) let shape = CAShapeLayer() shape.path = rounded.cgPath self.layer.mask = shape } } 函数中,它表示表达式太复杂,无法在合理的时间内解决;考虑将表达式分解为不同的子表达式。

map

2 个答案:

答案 0 :(得分:3)

问题是由于代码复杂,编译器无法理解结果类型。在闭包中指定结果类型将有所帮助。例如,将您的上一张地图更改为类似的内容(实际代码取决于实际类型,我只会做出假设):

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

答案 1 :(得分:0)

如果你努力使你的代码具有人类可读性,那么使编译器可读是一件轻而易举的事。就目前而言,我无法查看大部分转换并找出类型。如果我作为一个人类很难推断出类型,那么编译器已经真的很难与类型推断陷入困境,将会有更难的时间。

如另一条评论中所述,在每个转换块中明确显示类型将有所帮助。

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

记住:你不是在编写机器代码或程序集。你是用高级语言写的。这样做的第一个原因是代码可以被其他人读取。如果您的代码违反了该规则,则应重新评估其编写方式。