Commutateur : Enum Commutateur question : n'est Pas membre d'un int
Je suis en train d'écrire mon premier projet en Swift(je l'ai fait ObjectiveC depuis des années) et pour une raison quelconque, je ne peux pas savoir pourquoi mon enum et le Commutateur ne sont pas de travail togetber
enum ContactViewMode : Int
{
case ViewModeFavourite = 0
case ViewModeRecent = 1
case ViewModeContacts = 2
}
Propriété
@IBInspectable var contactViewMode : Int!
Commutateur
switch contactViewMode {
case ContactViewMode.ViewModeFavourite:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
case ContactViewMode.ViewModeRecent:
contacts = DBManager.getFavouriteContacts() as [ContactEntity]
default:
contacts = DBManager.getAllContacts() as [ContactEntity]
}
L'erreur que j'obtiens est
Enum cas 'ViewModeFavourite" n'est pas un membre de type 'Int!'
Alors je l'ai changé à ce qu'il n'est pas un Int! (J'ai besoin d'Int! pour 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]
}
Puis-je obtenir
Enum cas de motif ne peut pas faire correspondre les valeurs de la non-enum type 'Int'
Vous devez vous connecter pour publier un commentaire.
Vous devez déclarer
contactViewMode
commeContactViewMode
et pasInt
.Si vous voulez vraiment être
Int
, alors vous devez changer le cas de votre commutateur, par la comparaison de la variable à larawValue
propriété de l'enum cas:mais à moins d'avoir une bonne raison pour que je ne recommanderais pas
Les autres réponses de ne pas profiter de Swift du typage fort. Remarque qu'ils ont tous un
default
cas dans leurswitch
. Swift sait au moment de la compilation, cependant, si vous avez couvert tous les cas d'uneenum
ou pas, rendant ainsi ledefault
cas inutile.Cette fonctionnalité est utile de la langue. Imaginez que vous ajoutez un supplément de
case
à votreenum
à un moment plus tard. Le compilateur va se plaindre et de vous diriger à tous lesswitch
es qui ne sont pas à considérer que particuliercase
.Comment pouvons-nous profiter de Swift taper fort, alors?
D'abord, nous allons résoudre le nommage de vos énumération. Comme je suppose que vous êtes imbrication à l'intérieur d'un
ContactView
classe (et, contrairement à Objective-C, il faut vraiment être à l'intérieur de), vous pouvez attribuer un nom auenum
simplementMode
. Pas besoin de mentionnerViewMode
s dans le cas non plus. De cette façon, vous obtenez une plus propre, plus idiomatiques type.Ce que nous devons faire est d'effectuer le
switch
sur unMode
, pas sur unInt
. VotreMode
estRawRepresentable
, et en tant que tel, vous pouvez faire:C'est tout là est à lui—au lieu de passer sur le
rawValue
, obtenir la bonneMode
d'abord, et puis de passer sur elle.Cela a fonctionné pour moi:
J'ai un enum comme ceci:
Puis un interrupteur qui ressemble à ceci:
Im boucle dans un tableau de "b" des objets qui ont une proximité de la propriété.
b.proximity as Proximity
.. ne pas le compilateur sait déjà queb.proximity
est de typeProximity
?Les énumérations sont des types. Juste parce que vous faire comprendre que la seule enum valeurs peuvent être exprimées à
Int
n'est pas valable pour déclarercontactViewMode
unInt!
. Les types n'ont tout simplement pas de match.Donc, soit déclarer
contactViewMode
commeContactViewMode
, utilisez votre premièreswitch
déclaration et jeté àInt!
lorsque vous en avez besoin pour le storyboard, ou utiliser la deuxièmeswitch
, mais ne pas utiliser de.ViewModeFacourite
et al, mais leInt
valeur.Vous ne pouvez pas directement de match
Int
avecenum
. Au lieu de cela, vous devez les convertir enContactViewMode
àInt
avec.rawValue
de propriété, OU de convertirInt
àContactViewMode
avecinit(rawValue:)
initialiseur.Le dernier exemple:
parce que
ContactViewMode(rawValue:)
retourne Options, nous avons besoin de.Some()
..Some
faire? Avez-vous un lien vers les docs?Optional
c'est juste unenum
(.None
ou.Some(T)
), on peut faire correspondre à son encontre que les modèles.Vous pouvez simplement utiliser contactViewMode et de créer un nouveau var de type
ContactViewMode
dans le cas où la valeur decontactViewMode
est venue de quelque part d'autre et il doit êtreint
.Maintenant, vous pouvez facilement utiliser l'interrupteur comme indiqué ci-dessous: