Swift中的操作员优先级

时间:2016-03-09 05:51:36

标签: ios swift

我只花了几个小时试图调试一些代码,通过一个消除过程我能够解决问题,但我无法弄清楚原因和它的烦恼同样多。

所以有点上下文:我们希望根据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%肯定所以我正在寻求澄清/或者原因是否是其他原因。

3 个答案:

答案 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

作为三元的条件,这就是为什么它不起作用所以现在你添加了括号,所以它工作正常