我只花了几个小时试图调试一些代码,通过一个消除过程我能够解决问题,但我无法弄清楚原因和它的烦恼同样多。
所以有点上下文:我们希望根据Elements elements1 = document.select("discountPrice");
productPrice= elements1.first().text();
System.out.println(productPrice);
类型的谓词集合过滤一个对象数组(我们将其称为类型Object
)。我们首先将所有谓词组合成一个组合函数,然后使用带有组合谓词的过滤器函数来获取过滤后的对象数组。所以这是一个例子:
Object -> Bool
上面的示例工作正常但是当尝试为谓词引入可选项时,它并没有按预期工作。
var predicateA: (Object -> Bool) = { (obj) in obj.isFoo }
var predicateB: (Object -> Bool) = { (obj) in obj.isBar }
var composedPredicate: (Object -> Bool) {
return { (obj) in
return predicateA(obj) && predicateB(obj)
}
}
因此,上面的代码将导致compositionPredicate总是返回true,即使其中一个" sub-predicates"返回false。
可以通过更改optionPredicateLine以包含parans
来解决此问题var predicateA: (Object -> Bool) = { (obj) in obj.isFoo }
var optionalPredicateB: (Object -> Bool)? = nil
var composedPredicate: (Object -> Bool) {
return { (obj) in
return predicateA(obj)
&& optionalPredicateB != nil ? optionalPredicateB!(obj) : true
}
}
修改
我认为错误是由于三元运算符中运算符的优先级,即在确定使用哪种情况时,它正在评估三元运算符中&& (optionalPredicateB != nil ? optionalPredicateB!(obj) : true)
之前的所有&&
语句。 / p>
虽然我对此并不是100%肯定所以我正在寻求澄清/或者原因是否是其他原因。
答案 0 :(得分:3)
您可以找到运算符here的优先级。它显示"&&"优先级为120,而"?:"优先级为100,"!="是130.因此"&&"正在三元运算符之前进行评估,这相当于:
return (predicateA(obj) && (optionalPredicateB != nil)) ? optionalPredicateB!(obj) : true
答案 1 :(得分:0)
您可以找到中缀运算符here的Swift列表。它们按递减顺序排序。
答案 2 :(得分:-1)
在这一行
return predicateA(obj)
&& optionalPredicateB != nil ? optionalPredicateB!(obj) : true
编译器正在
predicateA(obj)
&& optionalPredicateB != nil
作为三元的条件,这就是为什么它不起作用所以现在你添加了括号,所以它工作正常