我该如何解决这个问题?在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
答案 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表达式时,我认为将每个转换的输出分配给一个新的,明确命名的变量是一个好主意(虽然不那么酷/令人兴奋)。
记住:你不是在编写机器代码或程序集。你是用高级语言写的。这样做的第一个原因是代码可以被其他人读取。如果您的代码违反了该规则,则应重新评估其编写方式。