Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Switch : Enum Switch issue : Not member of a int

Tags:

enums

swift

I am writing my first project in Swift(I have been doing ObjectiveC for years) and for some reason, I cant work out why my enum and Switch are not working togetber

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

Property

 @IBInspectable var contactViewMode : Int! 

Switch

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

The error I get is Enum case 'ViewModeFavourite' is not a member of type 'Int!'

So I changed it to this as it is not a Int! (I need 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]         } 

Then I get Enum case pattern cannot match values of the non-enum type 'Int'

like image 840
Burf2000 Avatar asked Nov 13 '14 10:11

Burf2000


People also ask

Can enum be used in switch case in C?

Example of Using Enum in Switch Case Statement We will then use the switch case statements to switch between the direction elements and print the output based on the value of the variable for the enum directions.

What is rawvalue in Swift?

Enumerations in Swift are much more flexible, and don't have to provide a value for each case of the enumeration. If a value (known as a raw value) is provided for each enumeration case, the value can be a string, a character, or a value of any integer or floating-point type.

What is enum or enumerations in Swift?

In Swift, an enum (short for enumeration) is a user-defined data type that has a fixed set of related values. We use the enum keyword to create an enum. For example, enum Season { case spring, summer, autumn, winter } Here, Season - name of the enum.

How does enum work in Swift?

Enumerations (or enums for short) in Swift define a common type for a group of related values. According to the Swift documentation, enums enable you to work with those values in a type-safe way within your code. Enums come in particularly handy when you have a lot of different options you want to encode.


2 Answers

You have to declare contactViewMode as ContactViewMode and not Int.

If you really want it to be Int, then you have to change the cases in your switch, by comparing the variable to the rawValue property of the enum cases:

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

but unless you have a good reason for that, I wouldn't recommend

like image 66
Antonio Avatar answered Sep 29 '22 13:09

Antonio


The other answers fail to take advantage of Swift’s strong typing. Note that they all have a default case in their switch. Swift knows at compile time, however, whether you have covered all cases of an enum or not, thus rendering the default case unnecessary.

This is a useful feature of the language. Imagine you add an extra case to your enum at a later point. The compiler will complain and point you to all the switches that are not considering that particular case.

How can we take advantage of Swift’s strong typing, then?

First, let’s fix the naming of your enumeration. As I assume you are nesting it inside a ContactView class (and, unlike in Objective-C, it should really be inside it), you can name the enum simply Mode. No need to mention ViewModes in the cases, either. This way you get a cleaner, more idiomatic type.

enum Mode: Int {     case favourite     case recent     case contacts } 

What we need to do is to perform the switch on a Mode, not on an Int. Your Mode is RawRepresentable, and as such you can do:

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

That’s all there is to it—instead of switching on the rawValue, get the proper Mode first and then switch on it.

like image 44
Quico Moya Avatar answered Sep 29 '22 11:09

Quico Moya