我知道如何自定义二元运算符,就像这样
infix operator ** { associativity left precedence 170 }
func ** (left: Double, right: Double) -> Double {
return pow(left, right)
}
Run Code Online (Sandbox Code Playgroud)
但是,如何在Swift中自定义三元运算符?谁能给我一些想法?非常感谢!
Nat*_*ook 18
实际上,您可以通过声明两个单独的运算符来协同工作,并为其中一个运算符使用curried函数.
让我们声明一个三元运算符x +- y +|- z,它将检查初始值的符号x,然后y如果符号为零或正值则返回第二个值,如果z符号为负则返回最终值.也就是说,我们应该能够写:
let sign = -5 +- "non-negative" +|- "negative"
// sign is now "negative"
Run Code Online (Sandbox Code Playgroud)
我们首先宣布两个运营商.重要的是在第二个运算符上有更高的优先级 - 我们将首先评估该部分并返回一个函数:
infix operator +- { precedence 60 }
infix operator +|- { precedence 70 }
Run Code Online (Sandbox Code Playgroud)
然后定义函数 - 我们将首先定义第二个:
func +|-<T>(lhs: @autoclosure () -> T, rhs: @autoclosure () -> T)(left: Bool) -> T {
return left ? lhs() : rhs()
}
Run Code Online (Sandbox Code Playgroud)
这里的重要部分是这个函数是curry - 如果你只用前两个参数调用它,而不是返回一个T值,它返回一个(left: Bool) -> T函数.这成为我们第一个运算符的函数的第二个参数:
func +-<I: SignedIntegerType, T>(lhs: I, rhs: (left: Bool) -> T) -> T {
return rhs(left: lhs >= 0)
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用我们的"三元"运算符,如下所示:
for i in -1...1 {
let sign = i +- "" +|- "-"
println("\(i): '\(sign)'")
}
// -1: '-'
// 0: ''
// 1: ''
Run Code Online (Sandbox Code Playgroud)
一个"真正的"三元运算符,例如_ ? _ : _需要语言支持.Swift只允许创建和自定义一元和二元运算符.
您可以在@ NateCook的答案中使用该技术来创建一对二元运算符,它们像三元运算符一样工作,但它们仍然是独立的二元运算符 - 您可以单独使用它们.(与此相反,_ ? _ : _是只有一个三元运算符; _ ? _和_ : _不能单独使用).
当然,为什么要停在那里?您可以链接更多二元运算符以创建四元运算符,依此类推.要获得额外的功劳,请尝试让自己成为一名扩展的宇宙飞船
let c: String = a <=> b
|<| "a < b"
|=| "a = b"
|>| "a > b"
Run Code Online (Sandbox Code Playgroud)
(...但请仅将其作为学术练习,或者使用您编写的代码的任何其他人都会讨厌您.)
| 归档时间: |
|
| 查看次数: |
6242 次 |
| 最近记录: |