2016-12-15 1 views
1

J'écris un jeu rapide et je veux écrire une liste de buts cibles pour le jeu court, moyen et long. Ceci est juste une liste linéaire des objectifs pour l'argent.Swift - Obtenir la valeur du dictionnaire où la clé est une énumération

enum GameLength : Int { 
    case ShortGame 
    case MediumGame 
    case LongGame 

    static let allValues = [ 
     GameLength.ShortGame.rawValue, 
     GameLength.MediumGame.rawValue, 
     GameLength.LongGame.rawValue, 
     ] 
} 

struct GameGoal { 

// I think this should be a set as the game lengths cannot repeat 
     var cashGoals = [ [GameLength.ShortGame: 100] , 
          [GameLength.MediumGame: 200] , 
          [GameLength.LongGame: 300] ] 


    func target(gameLength:GameLength) { 
     var result = cashGoals[gameLength].first 
     print (result) 
    } 
} 

var gameLength:GameLength = .MediumGame 
var gameGoal = GameGoal().target(gameLength) 

print (gameGoal) 

Le problème ici est que je n'arrive pas à accéder maintenant à la valeur pour la cible donnée.

Idéalement, je souhaite mapper l'énumération gameLength avec une valeur.

La raison pour laquelle ils sont séparés est parce que j'ai besoin d'appliquer une pondération à l'objectif de trésorerie plus tard.

Peut-être que je suis trop compliquer le problème.

Mais peu importe;

Question> Comment puis-je accéder au dictionnaire où la clé est un ENUM, et seulement obtenir la première ENUM qui correspond à la valeur

Répondre

2

Vous pouvez réellement définir les valeurs brutes de vos énumérations afin que vous n'avez pas pour faire face à ce dictionnaire du tout.

enum GameLength : Int { 
    case ShortGame = 100 
    case MediumGame = 200 
    case LongGame = 300 
} 

Ensuite, vous pouvez y accéder via gameLength.rawValue

+0

Ceci est un code OP, pas le mien. Il n'a pas demandé de conseils de style. – Bek

+2

@Bek Peu importe, les amis ne laissent pas les amis écrire le code Swift 2 dans Swift 3 – Alexander

+0

Le commentaire appartient à OP post alors. – Bek

1

cashGoals déclarée ici n'est pas un dictionnaire. C'est un tableau de dictionnaires avec une clé: valeur chacun. Fossé l'interne [] et vous pouvez vous inscrire avec votre énumération. De plus, à partir de swift 3, la convention consiste à utiliser des minuscules pour les cas d'énumération.

var cashGoals: [GameLength: Int] = [.shortGame: 100 , 
            .mediumGame: 200 , 
            .longGame: 300 ] 
print(cashGoals[.shortGame]) // 100 
print(GameLength.shortGame.rawValue) // 0 

Vous pouvez aussi simplement faire la valeur brute de la Énumération Int dont vous avez besoin, mais peut-être que vous voulez garder la longueur du jeu et le but de l'argent comme des pièces séparées de données afin que vous puissiez modifier l'objectif de trésorerie pour chaque longueur .. vous ne pouvez pas changer l'enum rawValue, mais vous pouvez changer la variable de la structure.

+0

Beaucoup Merci. Je sentais que je complaisais mon résultat de toute façon. – zardon