gpt4 book ai didi

ios - Swift 中的运算符优先级

转载 作者:搜寻专家 更新时间:2023-11-01 07:26:20 24 4
gpt4 key购买 nike

我只是花了令人沮丧的几个小时尝试调试代码,通过排除过程我能够解决问题,但我无法找出原因,它同样困扰着我。

那么一点上下文:我们想根据 Object -> Bool 类型的谓词集合来过滤对象数组(我们将称之为 Object 类型) 。我们首先将所有谓词组合成一个组合函数,然后将过滤器函数与我们的组合谓词一起使用以获取过滤后的对象数组。所以这里有一个例子:

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

上面的例子工作得很好,但是当尝试为谓词引入可选时,它并没有按预期工作。

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

因此上面的代码将导致 composedPredicate 始终返回 true,即使其中一个“子谓词”返回 false。

这可以通过更改 optionPredicateLine 以包含 parans 来解决

&& (optionalPredicateB != nil ? optionalPredicateB!(obj) : true)

编辑:

我认为错误是由于三元运算符中运算符的优先级造成的,即它在确定时评估三元运算符中 ? 之前的所有 && 语句使用哪种情况。

虽然我对此不是 100% 确定,所以我正在寻求澄清/或者是否有其他原因。

最佳答案

您可以找到运算符的优先级 here .它显示“&&”的优先级为 120,而“?:”的优先级为 100,而“!=”为 130。因此,“&&”在三元运算符之前被评估,相当于:

return (predicateA(obj) && (optionalPredicateB != nil)) ? optionalPredicateB!(obj) : true

关于ios - Swift 中的运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35883944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com