2014-07-20 21 views
5

tôi nhận được lỗi này:Swift - sử dụng enum trong câu lệnh switch

'NSNumber' is not a subtype of Cat 

Đây là mã:

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

Làm thế nào tôi có thể giải quyết lỗi này?

+0

Câu trả lời đơn giản là, đừng cố nói dối về loại; indexPath.row là một Int, không phải là một Cat. Tuy nhiên, đừng để điều đó ngăn cản bạn; những gì bạn đang làm là cực kỳ Swifty và bạn nên tiếp tục đi xuống con đường này. Rất đẹp. – matt

Trả lời

8

Sử dụng Cat.fromRaw(indexPath.row) để nhận được điều tra.

Bởi vì giá trị trả về của fromRaw() là một tùy chọn, sử dụng nó như vậy:

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

Con đường tôi xử lý loại này tương tự về tình hình trong một ứng dụng gần đây là sử dụng một Struct bao gồm toàn bộ các tĩnh các thành viên, thay vì một Enum - một phần vì tôi có thêm thông tin để liên kết với mỗi tùy chọn, một phần vì tôi bị bệnh phải gọi toRaw()fromRaw() mọi nơi, và một phần vì (như ví dụ của bạn cho thấy bạn đã khám phá) Enum mất lợi thế của nó khi nó chỉ ra rằng bạn không thể chu kỳ thông qua, hoặc có được một danh sách đầy đủ, các trường hợp.

Vì vậy, những gì tôi đã làm được điều này:

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

Bây giờ khi chúng tôi nhận được cellForRowAtIndexPath Tôi có thể nói chuyện như thế này:

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 
    } 

Về cơ bản tôi đã chỉ được sử dụng hai Struct như không gian tên với một số thông minh bổ sung. Tôi không nói điều này tốt hơn những gì bạn đang làm; cả hai đều nổi tiếng Swifty. Nó chỉ là một ý tưởng khác để xem xét.

+0

Tuyệt. GoZoner kỹ thuật trả lời câu hỏi. Nhưng tôi nghĩ rằng tôi sẽ làm một số refactoring như thế này vì vậy tôi không phải tiếp tục gõ ra chuỗi. +1 – soleil

+0

Bạn có thể muốn xem xét ít nhất một enum của chuỗi thay vì một enum của ints, cùng với một chức năng tĩnh trả về một danh sách các trường hợp, tương tự như những gì tôi đang làm. – matt

+0

Làm thế nào bạn sẽ làm một cái gì đó như 'cho phong cách = Styles.Animals?' Tôi nhận được "NSString không phải là một loại phụ của Styles" – soleil

Các vấn đề liên quan