Swift - 在switch语句中使用enum

时间:2014-07-20 17:45:49

标签: enums swift switch-statement

我收到此错误:

'NSNumber' is not a subtype of Cat

以下是代码:

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

如何解决此错误?

2 个答案:

答案 0 :(得分:8)

使用Cat.fromRaw(indexPath.row)获取枚举。

因为fromRaw()的返回值是可选,所以请按照以下方式使用它:

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

答案 1 :(得分:3)

我在最近的应用程序中处理同样情况的方式是使用完全由静态成员组成的Struct而不是Enum - 部分原因是因为我有更多信息与每个选项相关联,部分原因是因为我得到了我不得不在每个地方打电话给toRaw()fromRaw(),部分因为(正如你的例子所示,你已经发现),当事实证明你无法发现它时,它会失去优势循环,或获得案件的完整清单。

所以,我做的是这个:

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

现在,当我们到达cellForRowAtIndexPath时,我可以这样说:

    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
    }

基本上我只使用了两个Structs作为名称空间,并增加了一些智能。我并不是说这比你做的更好;他们都非常迅速。这只是另一个想法。