gpt4 book ai didi

ios - 如何在 Swift 中自定义三元运算符

转载 作者:IT王子 更新时间:2023-10-29 05:29:11 26 4
gpt4 key购买 nike

我知道如何自定义二元运算符,像这样

infix operator ** { associativity left precedence 170 }
func ** (left: Double, right: Double) -> Double {
return pow(left, right)
}

但是,如何在 Swift 中自定义三元运算符呢?谁能给我一些想法?非常感谢!

最佳答案

实际上,您可以通过声明两个协同工作的独立运算符并为其中一个运算符使用柯里化(Currying)函数来做到这一点。

让我们声明一个三元运算符 x +- y +|- z,它将检查初始值 x 的符号,然后返回第二个值 y 如果符号为零或正,最终值 z 如果符号为负。也就是说,我们应该能够写:

let sign = -5 +- "non-negative" +|- "negative"
// sign is now "negative"

我们将从声明两个运算符开始。重要的部分是在第二个运算符上有更高的优先级 - 我们将首先评估该部分并返回一个函数:

infix operator +- { precedence 60 }
infix operator +|- { precedence 70 }

然后定义函数——我们先定义第二个:

func +|-<T>(lhs: @autoclosure () -> T, rhs: @autoclosure () -> T)(left: Bool) -> T {
return left ? lhs() : rhs()
}

这里的重要部分是这个函数是柯里化(Currying)的——如果你只用前两个参数调用它,而不是返回一个 T 值,它返回一个 (left: Bool ) -> T 函数。这成为我们第一个运算符的函数的第二个参数:

func +-<I: SignedIntegerType, T>(lhs: I, rhs: (left: Bool) -> T) -> T {
return rhs(left: lhs >= 0)
}

现在我们可以像这样使用我们的“三元”运算符:

for i in -1...1 {
let sign = i +- "" +|- "-"
println("\(i): '\(sign)'")
}
// -1: '-'
// 0: ''
// 1: ''

注意:我写了一个blog post on this subject再举一个例子。

关于ios - 如何在 Swift 中自定义三元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26637821/

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