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

时间:2014-11-13 10:54:30

标签: swift enums

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

enum ContactViewMode : Int
    {
        case ViewModeFavourite = 0
        case ViewModeRecent = 1
        case ViewModeContacts = 2
    }

属性

 @IBInspectable var contactViewMode : Int!

切换

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

我得到的错误是 枚举案例'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]
        }

然后我明白了  枚举案例模式无法匹配非枚举类型“Int”

的值

6 个答案:

答案 0 :(得分:27)

您必须将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]
}

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

答案 1 :(得分:22)

其他答案未能利用Swift的强力打字。请注意,他们在 /* * This is a manifest file that'll be compiled into application.css, which will include all the files * listed below. * * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. * * You're free to add application-wide styles to this file and they'll appear at the top of the * compiled file, but it's generally better to create a new file per style scope. * *= require fullcalendar *= require_self *= require jquery.ui.all *= require_tree . */ #banner { background: #282827; padding: 10px; border-bottom: 2px solid; font: small-caps 20px/20px "Times New Roman", serif; color: #141414; text-align: left; img { float: left; } } #notice { color: #000 !important; border: 2px solid red; padding: 1em; margin-bottom: 2em; background-color: #f0f0f0; font: bold smaller sans-serif; } #columns { background: #646462; #main { margin-left: 17em; padding: 2em; background: white; } #side { color: red; float: left; padding: 1em 2em; width: 13em; background: #646462; ul { padding: 0; li { list-style: none; a { color: #bfb; font-size: small; } } } } } 中都有default个案例。然而,Swift在编译时知道你是否覆盖了switch的所有情况,因此不需要enum这种情况。

这是该语言的一个有用功能。想象一下,您稍后会在default添加额外的case。编译器会抱怨并指向不考虑该特定enum的所有switch

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

首先,让我们修复枚举的命名。我假设您将它嵌套在case类中(并且与Objective-C不同,它应该中),您可以简单地命名ContactView { {1}}。在案例中也不需要提及enum。通过这种方式,您可以获得更清洁,更惯用的类型。

Mode

我们需要做的是在ViewMode上执行enum Mode: Int { case favourite case recent case contacts } ,而不是switch。您的ModeInt,因此您可以这样做:

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 */ } ,然后再启用它。

答案 2 :(得分:6)

这对我有用:

我有一个这样的枚举:

enum Proximity{
  case Unknown
  case Immediate
  case Near
  case Far
}

然后是一个看起来像这样的开关:

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
 }

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

答案 3 :(得分:4)

枚举是类型。只是因为您明确表示单个枚举值可以转换为Int并不能使contactViewMode Int!声明为有效。这些类型根本不匹配。

因此,要么将contactViewMode声明为ContactViewMode,请使用您的第一个switch语句,并在实际需要故事板时转换为Int!,或使用第二个{{} 1}},但不要使用switch等,而是使用相应的.ViewModeFacourite值。

Int

答案 4 :(得分:3)

您无法直接将Intenum匹配。相反,您必须使用ContactViewMode属性将Int转换为.rawValue,或使用Int初始化程序将ContactViewMode转换为init(rawValue:)

后一个例子:

switch ContactViewMode(rawValue: contactViewMode) {
case .Some(.ViewModeFavourite):
    contacts = DBManager.getFavouriteContacts() as [ContactEntity]
case .Some(.ViewModeRecent):
    contacts = DBManager.getFavouriteContacts() as [ContactEntity]
default:
    contacts = DBManager.getAllContacts() as [ContactEntity]
}

因为ContactViewMode(rawValue:)会返回Optionals,我们需要.Some()

答案 5 :(得分:1)

您可以简单地使用contactViewMode并创建一个ContactViewMode类型的新var,以防contactViewMode的值来自其他地方且必须为int

let contactMode :ContactViewMode = ContactViewMode(rawValue: contactViewMode)!

现在您可以轻松使用如下所示的开关:

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