2014-07-20 12 views
5

otrzymuję ten błąd:Swift - za pomocą enum w instrukcji switch

'NSNumber' is not a subtype of Cat 

Oto kod:

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; 
    } 

Jak mogę rozwiązać ten problem?

+0

Prosta odpowiedź brzmi: nie próbuj kłamać na temat typu; indexPath.row to Int, a nie Cat. Jednak nie pozwól, aby cię zatrzymać; to, co robisz, jest bardzo szybkie i powinieneś iść tą drogą. Bardzo dobrze. – matt

Odpowiedz

8

Użyj Cat.fromRaw(indexPath.row), aby uzyskać wyliczenie.

Ponieważ wartość zwracana fromRaw() jest opcjonalnie, użyj go jak tak:

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

Sposób, w jaki obsługiwane ten sam rodzaj sytuacji w ostatnim aplikacji było użyć struktury, na które składają się wyłącznie z statyczna członkowie, zamiast Enum - po części dlatego, że miałem więcej informacji do skojarzenia z każdą opcją, po części dlatego, że miałem dość konieczności wywoływania w każdym miejscu każdego z nich, a po części dlatego, że (jak pokazuje twój przykład) Enum traci swoją przewagę, gdy okazuje się, że nie można przejść przez cykl lub uzyskać pełną listę przypadków.

Więc co zrobiłem było tak:

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]! 
    } 
} 

Teraz, gdy mamy do cellForRowAtIndexPath mogę mówić tak:

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 
    } 

Zasadniczo mam tylko używane dwa kodowanym jako nazw z trochę dodatkowej inteligencji. Nie mówię, że to jest lepsze niż to, co robisz; oboje są wybitnie spieniężni. To tylko kolejny pomysł do rozważenia.

+0

Cool. GoZoner technicznie odpowiedział na pytanie. Ale myślę, że zrobię trochę refaktoryzacji w ten sposób, więc nie będę musiał pisać ciągów. +1 – soleil

+0

Możesz rozważyć przynajmniej wyliczenie ciągów znaków zamiast wyliczenia liczb int, wraz z funkcją statyczną, która zwraca listę przypadków, podobnie jak to, co robię. – matt

+0

Jak zrobiłbyś coś takiego: "pozwól, aby styl = Style. Zwierzęta"? Otrzymuję "NSString nie jest podtypem stylów" – soleil