2016-07-12 10 views
4

Ich habe eine verschachtelte Enum wie so, für die grundlegende relative Positionierung der Beschreibung:Die beste Möglichkeit, Enums für den Zugriff durch Switch-Anweisungen in Swift zu verschachteln?

enum Location { 
    enum Top { 
     case Left 
     case Right 
     case Center 
    } 
    enum Bottom { 
     case Left 
     case Right 
     case Center 
    } 
    enum Left { 
     case Top 
     case Bottom 
     case Center 
    } 
    enum Right { 
     case Top 
     case Bottom 
     case Center 
    } 
    enum Center { 
     case Center 
    } 
    } 

Wenn ich versuche, eine switch Anweisung, mit ihm zu laufen, keine der Aufzählungen zeigen als mögliche Fälle, und wenn ich versuche, zur Liste sie ich erhalte eine Fehlermeldung:

func switchOverEnum(enumCase: Location) { 
    switch enumCase { 
    case .Top: 
    print("hey this didn't cause an error whoops no it did") 
    } 
} 

der Fehler ist: Enum case 'Top' not found in type 'Location'.

Jetzt gibt es eine Version dieser Frage here, und nach den hilfreichsten Antwort, es sh

enum Location { 
    enum TopLocations { 
     case Left 
     case Right 
     case Center 
    } 
    enum BottomLocations { 
     case Left 
     case Right 
     case Center 
    } 
    enum LeftLocations { 
     case Top 
     case Bottom 
     case Center 
    } 
    enum RightLocations { 
     case Top 
     case Bottom 
     case Center 
    } 
    enum CenterLocations { 
     case Top 
     case Bottom 
     case Left 
     case Right 
     case Center 
    } 
    case Top(TopLocations) 
    case Bottom(BottomLocations) 
    case Left(LeftLocations) 
    case Right(RightLocations) 
    case Center(CenterLocations) 
    } 

die völlig funktioniert, aber scheint ein wenig klobig oder unelegant oder un-Swift-like: Ould wie dies getan werden. Ist das wirklich der beste Weg?

+1

Warum ist es nicht schwungvoll? Es gibt eine einfache Sache maximale Komplexität. Das ist total swifty. –

+0

Unklar, was du verlangst. Dein Original war einfach albern ('.Top' ist _nicht_ ein Fall von Location, es ist ein verschachteltes Enum, also ist es schwer vorstellbar, was du erwartet hast), und" bester Weg "ist eine Frage der Meinung. – matt

+0

Ich stimme zu, diese Frage als primär meinungsbezogen zu schließen, da Antworten nur auf Meinung und Vorliebe beruhen können, nicht auf Fakten. Erwägen Sie die Veröffentlichung in [Code Review] (http://codereview.stackexchange.com) mit einem vollständigen, realen Beispiel. – JAL

Antwort

3

Ich denke, das wäre viel prägnanter ausgedrückt mit zwei Enums und einem Tupel. Versuchen Sie dies auf einem Spielplatz:

enum HorizontalPosition { 
    case Left 
    case Right 
    case Center 
} 

enum VerticalPosition { 
    case Top 
    case Bottom 
    case Center 
} 

typealias Location = (horizontal: HorizontalPosition, vertical: VerticalPosition) 

let aLocation = Location(horizontal: .Left, vertical: .Bottom) 

switch aLocation { 

case (.Left, .Bottom): print ("left bottom") 
case (.Center, .Center): print ("center center") 
default: print ("everything else") 
} 
+0

Auch wenn die Frage zu Ende geht, sollten Sie sich etwas einfallen lassen: das ist eine gute Antwort. Vielen Dank! –

+0

@LeMotJuiced danke! Ich hoffe, ich konnte helfen –