Swift是否有太空船运营商<=>,如果没有,将如何创建自定义运营商?

Ven*_*eri 2 spaceship-operator swift

来自维基百科:

与传统的相等运算符不同,传统的相等运算符将返回true或false,具体取决于参数是相等还是不相等,spaceship运算符将返回1,0或-1,具体取决于左参数相对于right参数的值.如果left参数大于right参数,则运算符返回1.如果left参数小于right参数,则运算符返回-1.如果两个参数相等,则运算符返回0.

宇宙飞船运营商主要用于排序比较.

mem*_*ons 12

Swift没有内置的太空飞船运营商,但在swift中创建新的运营商是微不足道的.让我们创建一个新的运算符,它返回一个enum而不是Int- 魔术数字坏的,我们不应该将它们用于强类型语言的返回类型.在我们处理它时,让我们利用Swift的Unicode支持,并使用←,→,&make使枚举支持成为结果的可视指示器:

enum Spaceship
{
  case ? // LeftIsGreaterThanRight
  case ? // LeftIsLessThanRight
  case ? // LeftIsEqualToRight
}

operator infix <=> {}

@infix func <=> <T: Comparable> (left: T, right: T) -> Spaceship {
  if left < right { return SpaceShip.?}
  if left > right { return SpaceShip.?}
  return Spaceship.?;
}
Run Code Online (Sandbox Code Playgroud)

现在您可以像这样使用new运算符

if someInt <=> someOtherInt == ?
{
  // take off!
}
Run Code Online (Sandbox Code Playgroud)

如果你坚持使用幻数作为比较结果的值(我真的,真的鼓励你不是在做雨燕),然后在这里:

@infix func <=><T: Comparable> (left: T, right: T) -> Int {
  if left < right { return -1 }
  if left > right { return  1 }
  return 0
}
Run Code Online (Sandbox Code Playgroud)

  • IMO,最好使用已经存在于Foundation中的(NS)ComparisonResult并在许多API中使用. (3认同)