2017-05-11 1 views
0

So habe ich diese enum, die unterschiedliche Ansicht Positionen auf einem View-Controller definiert, wenn ein Sidebar-Menü dargestellt wird. Ich muss die verschiedenen Werte basierend auf verschiedenen Situationen addieren, subtrahieren, multiplizieren oder dividieren. Wie genau stelle ich eine Methode her, die es mir erlaubt, -, +, * oder / Operatoren auf die Werte in enum zu verwenden. Ich kann viele Beispiele finden, die den Vergleichsoperator == verwenden. Obwohl ich keine finden konnte, die >= verwenden. Was ich auch tun muss.So addieren oder subtrahieren Sie zwei Aufzählungswerte in swift

Hier ist die enum

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

nun wie so versuche ich, diese Operatoren in Funktionen zu nutzen.

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

Auch in einer anderen Funktion wie so.

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

Ich weiß, dass ich die Funktionen direkt erstellen muss, damit ich diese Operatoren verwenden kann. Ich verstehe einfach nicht, wie ich es machen soll. Eine kleine Hilfe würde sehr geschätzt werden.

+3

Sie können ein 'Int' Rohwert verwenden und dann Vergleiche auf dem Rohwert durchführen, aber ich vermute, Sie sind gerade hier die falsche Sache zu tun versuchen. – Paulw11

+0

Was bedeutet links subtrahieren? o.0 ' – Alexander

+0

FYI - Die Fälle Ihrer Enum und ihrer Verwendung in Ihrem Code stimmen nicht überein. Beispiel: 'Links' vs. '.left'. – rmaddy

Antwort

2

Der Typ Sie zu definieren versuchen, eine ähnliche Algebra Zeiger, dass Sie einen Versatz zu einem Zeiger hinzufügen können, um einen Zeiger zu bekommen und zwei Zeiger subtrahieren ein erhalten Unterschied. Definieren Sie diese zwei Operatoren auf Ihrer Enum und Ihre anderen Funktionen werden funktionieren.

Alle Operatoren über Ihren Typ sollten Ergebnisse in Ihrem Typ produzieren. Je nach Ihren Anforderungen gibt es verschiedene Möglichkeiten, dies zu erreichen. Hier behandeln wir Ihren Typ als einen Wrap-around ("modulo") - addieren Sie 1 zum letzten Literal und Sie erhalten den ersten. Dazu verwenden wir Rohwerte von 0 bis n für Ihre Typliterale und verwenden Modulo-Arithmetik.

Zunächst benötigen wir einen Modulo-Operator, der immer ein + ve-Ergebnis zurückgibt, der Swift % kann einen Wert zurückliefern, der für die Modulo-Arithmetik nicht erforderlich ist.

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 
} 

nun Ihre Enum geeignete Ausgangswerte zuweisen:

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 

Nun definieren wir die entsprechenden Betreiber.

Für die Addition können wir eine ganze Zahl zu einem FrontViewPosition hinzufügen und eine FrontViewPosition zurück erhalten. Um dies zu tun, konvertieren wir in Rohwerte, fügen hinzu und reduzieren dann modulo 8, um es zu umbrechen.Beachten Sie die Notwendigkeit eines ! zurückzukehren eine nicht optionale FrontViewPosition - dies wird immer durch die Modulo Mathe gelingen:

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

Für Subtraktion wir den ganzzahligen Differenz zwischen zwei FrontViewPosition Werte zurück:

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

} 

Sie können weitere Operatoren nach Bedarf definieren, z. B. einen Subtraktionsoperator, der eine FrontViewPosition und eine Int übernimmt und eine FrontViewPosition zurückgibt.

HTH

+0

Dies ist ein noch besseres Beispiel. Vielen Dank für Ihre Antwort. – CarpenterBlood

1

Enum könnte Funktion ~

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 
Verwandte Themen