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

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

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

但是,如何在Swift中自定义三元运算符? 任何人都可以给我一些想法? 非常感谢!

实际上,你可以通过声明两个独立的运算符来共同工作,并为其中一个运算符使用curried函数。

我们声明一个三元运算符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() } 

这里的重要部分是这个函数是curried – 如果你只用前两个参数调用它,而不是返回一个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: '' 

注:我用另一个例子写了一篇关于这个主题的博客文章 。

一个“真正的”三元运算符,如_ ? _ : _ _ ? _ : _需要语言支持。 Swift允许创build和定制只有一元和二元运算符。

你可以在@NateCook的答案中使用这个技巧来创build一对二元运算符,它们像三元运算符一样工作,但它们仍然是独立的二元运算符 – 您可以单独使用它们。 (相反, _ ? _ : _ 只是一个三元运算符, _ ? __ : _不能单独使用。)

当然,为什么要在那里停下来? 您可以链接更多的二元运算符来创build四元运算符,依此类推。 要获得额外的信用,请尝试让自己成为一名扩展的飞船运营商

 let c: String = a <=> b |<| "a < b" |=| "a = b" |>| "a > b" 

(…但是请仅作为学术练习使用,否则使用您编写的代码的任何人都会憎恨您。)