2014-07-20 11 views
5

ich diesen Fehler:Swift - mit Enum in switch-Anweisung

'NSNumber' is not a subtype of Cat 

Hier ist der Code:

enum Cat:Int { 
    case Siamese = 0 
    case Tabby 
    case Fluffy 
} 

let cat = indexPath.row as Cat 
    switch cat { 
    case .Siamese: 
     //do something 
     break; 
    case .Tabby: 
     //do something else 
     break; 
    case .Fluffy: 

     break; 
    } 

Wie kann ich diesen Fehler beheben?

+0

Die einfache Antwort ist, versuchen Sie nicht, über den Typ zu lügen; indexPath.row ist ein Int, kein Cat. Aber lass dich nicht davon abhalten; was du tust, ist extrem Swifty und du solltest weiter diesen Weg gehen. Sehr schön. – matt

Antwort

8

Verwenden Sie Cat.fromRaw(indexPath.row), um die Aufzählung zu erhalten.

Da der Rückgabewert von fromRaw() ist ein optional, verwenden Sie es wie so:

if let cat = Cat.fromRaw (indexPath.row) { 
    switch cat { 
    // ... 
    } 
} 
3

So wie ich diese gleiche Art von Situation in einer aktuellen App behandelt war ein Struct zu verwenden ausschließlich aus statischen aus Mitglieder, anstatt einer Enum - zum Teil, weil ich mehr Informationen hatte, um mit jeder Option zu verbinden, zum Teil, weil ich es satt hatte, toRaw() und fromRaw() everyplace zu nennen, und teilweise, weil (wie Ihr Beispiel zeigt, dass Sie entdeckt haben) Enum verliert seinen Vorteil, wenn sich herausstellt, dass Sie nicht durchgehen oder eine vollständige Liste der Fälle erhalten können.

Also, was ich tat, war dies:

struct Sizes { 
    static let Easy = "Easy" 
    static let Normal = "Normal" 
    static let Hard = "Hard" 
    static func sizes() -> [String] { 
     return [Easy, Normal, Hard] 
    } 
    static func boardSize (s:String) -> (Int,Int) { 
     let d = [ 
      Easy:(12,7), 
      Normal:(14,8), 
      Hard:(16,9) 
     ] 
     return d[s]! 
    } 
} 

struct Styles { 
    static let Animals = "Animals" 
    static let Snacks = "Snacks" 
    static func styles() -> [String] { 
     return [Animals, Snacks] 
    } 
    static func pieces (s:String) -> (Int,Int) { 
     let d = [ 
      Animals:(11,110), 
      Snacks:(21,210) 
     ] 
     return d[s]! 
    } 
} 

Wenn wir jetzt zu cellForRowAtIndexPath bekommen kann ich so reden:

let section = indexPath.section 
    let row = indexPath.row 
    switch section { 
    case 0: 
     cell.textLabel.text = Sizes.sizes()[row] 
    case 1: 
     cell.textLabel.text = Styles.styles()[row] 
    default: 
     cell.textLabel.text = "" // throwaway 
    } 

Im Wesentlichen habe ich verwendet, nur die beiden Structs als Namensräume mit einige zusätzliche Intelligenz. Ich sage nicht, dass das besser ist als das, was du tust; sie sind beide sehr Swifty. Es ist nur eine andere Idee zu berücksichtigen.

+0

Kühl. GoZoner hat die Frage technisch beantwortet. Aber ich denke, ich werde so etwas refactoring machen, damit ich nicht ständig die Strings eintippen muss. +1 – soleil

+0

Vielleicht möchten Sie mindestens eine Aufzählung von Zeichenfolgen anstelle einer Aufzählung von Ints betrachten, zusammen mit einer statischen Funktion, die eine Liste der Fälle zurückgibt, ähnlich wie ich es tue. – matt

+0

Wie würdest du sowas machen wie "let style = Styles.Animals?" Ich bekomme "NSString ist kein Subtyp von Styles" – soleil