Switch:Enum Switch问题:不是int的成员

Bur*_*000 22 enums swift

我在Swift编写我的第一个项目(我已经做了多年的ObjectiveC)并且出于某种原因,我无法解决为什么我的枚举和Switch没有工作的问题

enum ContactViewMode : Int
    {
        case ViewModeFavourite = 0
        case ViewModeRecent = 1
        case ViewModeContacts = 2
    }
Run Code Online (Sandbox Code Playgroud)

属性

 @IBInspectable var contactViewMode : Int!
Run Code Online (Sandbox Code Playgroud)

开关

switch contactViewMode {
            case ContactViewMode.ViewModeFavourite:
                contacts = DBManager.getFavouriteContacts() as [ContactEntity]
            case ContactViewMode.ViewModeRecent:
                contacts = DBManager.getFavouriteContacts() as [ContactEntity]
            default:
                contacts = DBManager.getAllContacts() as [ContactEntity]
        }
Run Code Online (Sandbox Code Playgroud)

我得到的错误是 Enum case'ViewModeFavourite'不是'Int!'类型的成员

所以我改为它,因为它不是Int!(我需要Int!for Storyboard)

var contactMode:Int = contactViewMode

        switch contactMode {
            case .ViewModeFavourite:
                contacts = DBManager.getFavouriteContacts() as [ContactEntity]
            case .ViewModeRecent:
                contacts = DBManager.getFavouriteContacts() as [ContactEntity]
            default:
                contacts = DBManager.getAllContacts() as [ContactEntity]
        }
Run Code Online (Sandbox Code Playgroud)

然后我得到 Enum案例模式不能匹配非枚举类型'Int'的值

Ant*_*nio 28

您必须声明contactViewMode的ContactViewMode,而不是Int.

如果您真的想要它Int,那么您必须通过将变量rawValue与枚举案例的属性进行比较来更改开关中的案例:

switch contactViewMode {
case ContactViewMode.ViewModeFavourite.rawValue:
    contacts = DBManager.getFavouriteContacts() as [ContactEntity]
case ContactViewMode.ViewModeRecent.rawValue:
    contacts = DBManager.getFavouriteContacts() as [ContactEntity]
default:
    contacts = DBManager.getAllContacts() as [ContactEntity]
}
Run Code Online (Sandbox Code Playgroud)

但除非你有充分的理由,否则我不建议


Qui*_*oya 24

其他答案未能利用Swift的强力打字.请注意,他们都有一个default案例switch.然而,Swift在编译时知道你是否已经覆盖了所有的情况enum,因此default不需要渲染.

这是该语言的一个有用功能.想象一下,你添加一个额外的case给你enum在稍后的点.编译器会抱怨并指出所有switch不考虑该特定内容的es case.

那么我们怎样才能利用Swift强大的打字?

首先,让我们修复枚举的命名.我假设你将它嵌套在一个ContactView类中(而且,与Objective-C不同,它应该真的在它里面),你可以enum简单地命名Mode.也不需要ViewMode在案例中提及.通过这种方式,您可以获得更清洁,更惯用的类型.

enum Mode: Int {
    case favourite
    case recent
    case contacts
}
Run Code Online (Sandbox Code Playgroud)

我们需要做的是执行switcha Mode,而不是on Int.你Mode是RawRepresentable,你可以这样做:

guard let m = Mode(rawValue: contactViewMode) else { /* handle the situation */ }
switch m {
    case .favourite: /* handle case */
    case .recent: /* handle case */
    case .contacts: /* handle case */
}
Run Code Online (Sandbox Code Playgroud)

这就是它的全部 - 而不是打开它rawValue,先获得正确Mode然后再打开它.


Jon*_*gel 6

这对我有用:

我有这样的枚举:

enum Proximity{
  case Unknown
  case Immediate
  case Near
  case Far
}
Run Code Online (Sandbox Code Playgroud)

然后是一个如下所示的开关:

switch b.proximity as Proximity {
    case Proximity.Immediate:
         if b.rssi == -30 && b.accuracy == 0.2345{
             closestBeacon = b
         }
    case Proximity.Near:
         return
    case Proximity.Far:
         return
    default:
         return
 }
Run Code Online (Sandbox Code Playgroud)

我循环遍历具有邻近属性的"b"对象数组.