【问题标题】:How to make a custom relational operator in Swift如何在 Swift 中制作自定义关系运算符
【发布时间】:2016-09-21 19:43:37
【问题描述】:

我正在使用范围为 0..<360 的 Doubles。我想创建一个有 8 个案例的 switch 语句。 0、90、180 和 270 的情况,以及介于两者之间的值的情况。似乎半开运算符不会满足我在这里尝试做的事情。我认为解决方案可能是创建一个自定义关系运算符。我们就叫它<..<

case 0:
case 0<..<90:
case 90:
case 90<..<180:
case 180:
case 180<..<270:
case 270:
case 270<..<360:

我已经研究过创建一个自定义中缀运算符,该运算符返回 Bool,但这不起作用,因为参数只包含 lhs 和 rhs。

我怎样才能做到这一点?

【问题讨论】:

  • 案例不必互斥,它们按照定义的顺序进行检查,第一个获胜。您可以有一个case: 0,后跟case: 0..&lt;90
  • 感谢@MartinR。效果很好。
  • 我很好奇你是否在现实生活中得到过“准确”的数字。我怀疑你会得到大部分/所有时间的射程?
  • @MauryMarkowitz 这些数字绝对是边缘情况。我打开的值是来自CLLocationManagerDelegate 方法的CLHeading,这会产生一些非常“精确”的双值。

标签: ios swift operators


【解决方案1】:

您的开关过于复杂。看看这是否适合你:

let value: Double = 180

switch value {
    case 0:
        print("exactly 0")
    case 0..<90:
        print("less than 90")
    case 90:
        print("exactly 90")
    case 90..<180:
        print("less than 180")
    case 180:
        print("exactly 180")
    case 180..<270:
        print("less than 270")
    case 270:
        print("exactly 270")
    default:
        print("less than 360")
}

【讨论】:

  • 在这种情况下,如果值为 180 与 180.1 相比,我需要执行不同的操作。因此,半开关系运算符不符合我的要求。
  • Swift 的case 不会失败。一旦找到匹配项,它就会退出switch 语句。查看我的更新答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2017-10-01
  • 2019-10-06
  • 2010-12-03
相关资源
最近更新 更多