在Swift中使用枚举类型进行switch语句

5

I get this error:

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

我该如何解决这个错误?

简单的答案是,不要试图欺骗类型;indexPath.row 是一个 Int,而不是 Cat。然而,不要让这阻止你;你正在做的事情非常 Swifty,你应该继续走下去。非常好。 - matt
2个回答

10

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

由于fromRaw()的返回值是一个可选项,因此应像这样使用它:

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

3
最近我在一个应用中处理同类情况的方式是使用完全由静态成员组成的结构体,而不是枚举——其中一部分原因是我有更多的信息要与每个选项关联,另一部分原因是我厌倦了到处调用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
    }

本质上,我只是将这两个结构体用作具有一定智能的名称空间。我并不是说这比你正在做的更好;它们都是非常符合Swift语言特点的。这只是另一个值得考虑的想法。


很好。GoZoner在技术上回答了这个问题。但我认为我会进行一些重构,这样我就不必一遍又一遍地输入字符串了。+1 - soleil
你可能想考虑使用字符串枚举而不是整数枚举,同时还可以使用一个静态函数返回枚举的列表,类似于我正在做的事情。 - matt
你要如何做类似 let style = Styles.Animals? 的操作?我收到了“NSString 不是 Styles 的子类型”的错误信息。 - soleil
你让我有些摸不着头脑。或许可以单独提出一个问题来,这样你就可以展示你的代码了... - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接