0
votes

Swift Enum Obtenir la valeur de Int Enum à l'aide de la valeur de la chaîne

J'ai une énorme valeur brute est int. Je sais comment obtenir la valeur brute. Mais j'accède aux données via Webservice et les données pour Enum entrent en chaîne.

Permettez-moi de vous montrer mon énum, ​​alors nous discuterons des données qui doivent être converties enum, puis pour obtenir la valeur brute.

mon énum: xxx

Et les données que je reçois de WebService m'envoient de la valeur chaîne comme si xxx

ce que je veux:

Je veux correspondre à cette valeur de chaîne et à obtenir la valeur INT résultante. Par exemple, alors que je reçoive "vers l'avant", donc je dois le convertir enum et obtenir la valeur in int.

Je sais que je peux faire étui de commutation pour cela, mais je voulais savoir s'il peut être traité de manière plus propre .....

Merci d'avance s'il vous plaît.


0 commentaires

4 Réponses :


1
votes

Vous pouvez coder comme celui-ci;

enum ReportStatus : Int {
    case None = 0
    case Received = 2
    case Forward = 9
    case Reporting = 14
    case Completed = 50

    static func getRawValue(from value : String) -> Int {
        switch value {
        case "Forward":
            return self.Forward.rawValue
        case "Received":
            return self.Received.rawValue
        case "Reporting":
            return self.Reporting.rawValue
        case "Completed":
            return self.Completed.rawValue
        default:
            return self.None.rawValue
        }
    }

}


var valueToCompareWithEnum = "Forward"

let myVal = ReportStatus.getRawValue(from: valueToCompareWithEnum)

print(myVal) // 9


6 commentaires

Il n'y a pas de méthode propre autre que cela?


@ A.S.ali je suppose .. oui.


Apple a toujours fronça les sourcils sur l'utilisation du mot "get" dans les méthodes. Cela a-t-il changé avec Swift ou peut-être que cela s'applique simplement aux propriétés?


@trojanfoe J'utilise toujours dans mes méthodes (Obj-C & Swift) et je n'ai jamais confronté à un problème du côté Apple. Si vous pouvez donner un lien pertinent qui sera plus préférable de vous donner la réponse. Je pense pas que Apple ait un problème avec ce point.


@Dahiya_boy Il est intégré à Objective-C, par exemple si vous déclarez une propriété @property (lisonly) * chose; vous pouvez mettre en œuvre cela en fournissant - (chose *) chose {.. .} . Cela ne fonctionnera pas avec - (chose *) gettent {...} . Je ne sais cependant pas sur Swift.


@trojanfoe Fondamentalement, vous parlez de Setter-Getter et j'ai créé une méthode uniquement. Oui, Swift et Obj-C Getter-Setter Setter sont dans un style différent. Oui, vous pouvez créer un nom de méthode avec Get Word.



1
votes

Je vous recommande de changer d'int Enum à la chaîne pour le rendre plus alerte d'analyser et d'ajouter un champ de plus pour obtenir la valeur INT pour chaque cas: xxx

car ces données de la bande de chaîne Veuillez préciser l'analyse de la cordon de string Enum, puis utilisez votre propre valeur INT où vous avez besoin.


0 commentaires

1
votes

Puisque vous recevez ces chaînes d'un serveur, je suppose que vous voulez dire que vous les recevez codé dans JSON. Si oui, alors vous voulez probablement qu'ils soient décodables. Dans ce cas, vous pouvez mettre en œuvre un décodeur personnalisé.

Avant de montrer que, je vais renommer vos étuis énumérum pour correspondre à Swift Style, une lettre minuscule. Je fais cela pour rendre le problème légèrement plus difficile et montrer plus de techniques que vous pouvez utiliser. xxx

voici l'approche la plus simple: xxx

C'est une très bonne technique, mais depuis que nos noms de cas correspondent Les clés du serveur de près (tout simplement pas parfaitement), nous pourrions résoudre ce problème en descendant la clé de la clé: xxx


0 commentaires

1
votes

Vous pouvez laisser votre enum implémenter cédantable code> puis comparer votre chaîne à la représentation de chaîne de chaque cas d'enum à l'aide de array.first (où:) code> xxx


En tant que variante Voici une fonction générique globale qui fait la même chose, mais elle renvoie la caisse Enum plutôt que la valeur brute. P>

if let item = translate(valueToCompareWithEnum, forEnum: ReportStatus.self) {
    print(item.rawValue)
}


0 commentaires