如何在swift中添加或减去两个枚举值

时间:2017-05-11 01:16:12

标签: enums swift3

所以我有这个enum,当出现侧栏菜单时,它定义了View控制器上的不同视图位置。我需要根据不同的情况对不同的值进行加,减,乘或除。我究竟如何形成一种方法,允许我对-中的值使用+*/enum运算符。我可以找到很多使用比较运算符==的示例。虽然我还没有找到任何使用>=的内容。我也需要这样做。

以下是enum

enum FrontViewPosition: Int {
    case None
    case LeftSideMostRemoved
    case LeftSideMost
    case LeftSide
    case Left
    case Right
    case RightMost
    case RightMostRemoved
}

现在我试图在这样的函数中使用这些运算符。

func getAdjustedFrontViewPosition(_ frontViewPosition: FrontViewPosition, forSymetry symetry: Int) {
    var frontViewPosition = frontViewPosition
    if symetry < 0 {
        frontViewPosition = .Left + symetry * (frontViewPosition - .Left)
    }
}

另外还有其他功能。

func rightRevealToggle(animated: Bool) {
    var toggledFrontViewPosition: FrontViewPosition = .Left
    if self.frontViewPosition >= .Left {
        toggledFrontViewPosition = .LeftSide
    }
    self.setFrontViewPosition(toggledFrontViewPosition, animated: animated)
}

我知道我需要直接创建函数以允许我使用这些运算符。我只是不明白如何去做。一点帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您尝试定义的类型具有与指针类似的代数,因为您可以向指针添加偏移量以获取指针并减去两个指针以获得差异。在枚举上定义这两个运算符,其他函数将起作用。

任何类型的操作符都应该在您的类型中生成结果。根据您的要求,有不同的方法可以实现这一目标。在这里,我们将你的类型视为一个环绕(&#34; modulo&#34;)一个 - 在最后一个文字中加1,你得到第一个。为此,我们使用0n的原始值作为类型文字并使用模运算。

首先我们需要一个总是返回+ ve结果的模运算符,Swift %可以返回-ve one,这不是模运算所需的。

infix operator %% : MultiplicationPrecedence
func %%(_ a: Int, _ n: Int) -> Int
{
   precondition(n > 0, "modulus must be positive")
   let r = a % n
   return r >= 0 ? r : r + n
}

现在你的枚举分配合适的原始值:

enum FrontViewPosition: Int
{
   case None = 0
   case LeftSideMostRemoved = 1
   case LeftSideMost = 2
   case LeftSide = 3
   case Left = 4
   case Right = 5
   case RightMost = 6
   case RightMostRemoved = 7

现在我们定义适当的运算符。

对于添加,我们可以向FrontViewPosition添加一个整数并返回FrontViewPosition。为此,我们转换为原始值,添加,然后减少模8以进行环绕。请注意,!需要返回非可选FrontViewPosition - 由于模数运算,这总是会成功:

   static func +(_ x : FrontViewPosition, _ y : Int) -> FrontViewPosition
   {
      return FrontViewPosition(rawValue: (x.rawValue + y) %% 8)!
   }

对于减法,我们返回两个FrontViewPosition值之间的整数差异:

   static func -(_ x : FrontViewPosition, _ y : FrontViewPosition) -> Int
   {
      return x.rawValue - y.rawValue
   }

}

您可以根据需要定义更多运算符,例如减法运算符,它使用FrontViewPositionInt并返回FrontViewPosition

HTH

答案 1 :(得分:1)

Enum可以有功能〜

enum Tst:Int {
    case A = 10
    case B = 20
    case C = 30
    static func + (t1:Tst,t2:Tst) -> Tst {
        return Tst.init(rawValue: t1.rawValue+t2.rawValue)! //here could be wrong!
    }
}

var a = Tst.A
var b = Tst.B
var c = a+b