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

Enums 如何在swift中添加或减去两个枚举值,enums,swift3,Enums,Swift3,因此,我有一个enum,当显示侧栏菜单时,它在视图控制器上定义了不同的视图位置。我需要根据不同的情况加、减、乘或除不同的值。如何准确地形成一种方法,允许我对枚举中的值使用-、+、*或/运算符。我可以找到大量使用比较运算符==的示例。虽然我还没有找到任何使用=的。我也需要能够做到这一点 这是enum enum FrontViewPosition: Int { case None case LeftSideMostRemoved case LeftSideMost c

因此,我有一个
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)
    }
}

我知道我需要直接创建函数,以便使用这些运算符。我只是不知道该怎么做。非常感谢您的一点帮助。

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

枚举可能有函数~

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

您试图定义的类型具有与指针类似的代数,即您可以向指针添加偏移量以获得指针,然后减去两个指针以获得差异。在枚举上定义这两个运算符,其他函数将正常工作

类型上的任何运算符都应在类型中生成结果。根据您的需求,有不同的方法来实现这一点。在这里,我们将把您的类型视为一个环绕(“模”)1-将1添加到最后一个文本,您将得到第一个文本。为此,我们使用从
0
n
的原始值作为您的类型文本,并使用模运算

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
}
首先,我们需要一个总是返回+ve结果的模运算符,Swift
%
可以返回-ve结果,这不是模运算所需的结果

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
   }

}
您可以根据需要定义更多的运算符,例如减法运算符,它接受
FrontViewPosition
Int
并返回
FrontViewPosition


HTH

您试图定义的类型与指针具有类似的代数关系,您可以向指针添加偏移量以获得指针,然后减去两个指针以获得差异。在枚举上定义这两个运算符,其他函数将正常工作

类型上的任何运算符都应在类型中生成结果。根据您的需求,有不同的方法来实现这一点。在这里,我们将把您的类型视为一个环绕(“模”)1-将1添加到最后一个文本,您将得到第一个文本。为此,我们使用从
0
n
的原始值作为您的类型文本,并使用模运算

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
}
首先,我们需要一个总是返回+ve结果的模运算符,Swift
%
可以返回-ve结果,这不是模运算所需的结果

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
   }

}
您可以根据需要定义更多的运算符,例如减法运算符,它接受
FrontViewPosition
Int
并返回
FrontViewPosition


HTH

您可以使用
Int
原始值,然后对原始值进行比较,但我怀疑您只是在尝试做错误的事情。左减意味着什么?o、 仅供参考-枚举的大小写及其在代码中的使用不匹配。示例:
Left
vs.
。Left
。我同意@Paulw11。我认为你在这里不是指枚举。这看起来就像你只想要常数。或者可能是一个包含所需操作函数的结构。你可以使用
Int
原始值,然后对原始值进行比较,但我怀疑你只是在尝试做错误的事情。左减意味着什么?o、 仅供参考-枚举的大小写及其在代码中的使用不匹配。示例:
Left
vs.
。Left
。我同意@Paulw11。我认为你在这里不是指枚举。看起来你只需要常量,或者可能需要包含所需操作函数的结构。这是一个更好的例子。谢谢你的回答。这是一个更好的例子。谢谢你的回答。