如何在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"
(…但是请仅作为学术练习使用,否则使用您编写的代码的任何人都会憎恨您。)
- 核心数据自定义策略的select器语法是什么?
- 我如何做indexOfObject或一个适当的containsObject
- 用AVAudioEngine从AVAudioPCMBuffer播放audio
- iOS:在应用程序购买pipe理多个自动更新订阅与升级和降级选项
- Swift – 如何将两个视图控制器链接到一个容器视图,并使用分段控制在它们之间切换?
- 检查Swift中的操作系统版本?
- 尝试从应用程序发送电子邮件,并不起作用 – 斯威夫特(iOS)
- App Store留下评论/评分iOS 8 Swift
- swift prepareForSegue not working / exc_breakpoint(code = exc_i386_bpt subcode = 0x0)