#Un meilleur inventaire 👑

Dans cette partie nous allons améliorer notre modèle et le rendre bien plus flexible et utile.

#🔧 Exercice 1

Créez un nouveau fichier LootItem.swift et ajoutez-y une structure LootItem qui contient les propriétés suivantes :

  • quantity : Int (avec une valeur par défaut à 1)
  • name : String
  • type : ItemType
  • rarity : Rarity
  • attackStrength : Int?
  • game : Game

🧑‍🚀 Si vous voulez ajouter d’autres propriétés, n’hésitez pas, c’est votre modèle, faites en ce que vous voulez.
Pour vous inspirez quelques UI de jeux vidéos afin de voir les stats des équipements -> https://interfaceingame.com/

#Enum Type

Cet enum contiendra les types suivants avec une image d’illustration sous forme d’émoji :

  • magic : ⭐️
  • fire : 🔥
  • ice : ❄️
  • wind : 💨
  • poison : ☠️
  • thunder : ⚡️
  • dagger : 🗡️
  • shield : 🛡️
  • bow : 🏹
  • ring : 💍
  • unknown : 🎲

Votre enum doit contenir l’émoji associé à chaque type.

#Enum Rareté

Cet enum existe déjà pour vous, mais améliorez le pour obtenir une Color associée à chaque cas.

🛟 Pour vous aider reprenez l’exercice sur les enum.

#Struct Game

Je vous fourni la structure Game, pensez à créer un fichier Game.swift pour la contenir.

enum GameGenre {
    case mmorpg, rpg, looter, fps, tps, strategy, unset
}

struct Game: Identifiable, Hashable {
    let name: String
    let id: UUID = UUID()
    let genre: GameGenre
    let coverName : String?
    
    static var emptyGame = Game(name: "", genre: .unset, coverName: nil)
}

// Hesitez pas mettre vos propres jeux dans la liste
let availableGames = [
    Game(name: "Elden Ring", genre: .rpg, coverName: nil),
    Game(name: "Skyrim", genre: .rpg, coverName: nil),
    Game(name: "WoW", genre: .mmorpg, coverName: nil),
    Game(name: "CS:GO", genre: .fps, coverName: nil),
    Game(name: "Diablo IV", genre: .looter, coverName: nil)
]

#S’aider

💡 Créez une liste d’item en dur pour votre inventaire, pour vos tests, et éviter de devoir ajouter des items à chaque fois.

  • Utilisez ChatGPT ou faites le à la main.
  • Quand vous lancez l’app, vous devriez avoir une liste d’items dans votre inventaire.
  • Ajoutez des covers pour vos jeux depuis le site https://www.igdb.com/
    • Ajouter les images dans les assets XCode et changer le nom coverName dans la liste availableGames en fonction

#🔧 Exercice 2

  • Utiliser votre nouvelle structure dans la vue principale, et essayer de lister les items de votre inventaire. En ajoutant visuellement les propriétés de votre choix.
  • Pourquoi vous avez une erreur qui vous parle de Identifiable ? Comment la corriger ? Ajouter un id de type UUID à votre structure en le conformant à Identifiable.
  • Faites en sorte que cela compile en commentant éventuellement le code qui ne compile pas coté AddItemView.

Voici un exemple de vue qui inclut nos changements :

#🔧 Exercice 3

  • Mettez à jour votre formulaire d’ajout (AddItemView) pour refléter les changements de votre modèle.

Votre vue doit inclure au minimum les champs de formulaire suivant

Utilisez les vues SwiftUI suivantes :

VueDescriptionChamps
TextFieldUn champ de textename
PickerUn picker pour choisir le type d’item. Avec le style PalettePickerStyle()type
PickerUn picker pour choisir la rareté de l’itemrarity
StepperUn stepper pour choisir la quantité d’itemquantity
ToggleUn toggle pour choisir si l’item possède une stat d’attaque ou non (voir le gif suivant)?
StepperUn stepper pour choisir la valeur de la stat d’attaque (voir le gif suivant)attackStrength
PickerUn picker pour choisir le jeu auquel appartient l’item, avec une valeur par défaut à .emptyGamegame

🛟 Vous aurez besoin d’utiliser .tag() pour les valeurs de certains picker. Il faudra savoir expliquer pourquoi.

Faites en sorte que tout fonctionne et que l’ajout d’un item fonctionne, l’item doit être ajouté à la liste et s’afficher dans la vue principale.

🎉 Tout fonctionne ? Bravo, vous maitrisez un peu plus l’art du @Binding et de la gestion d’état avec SwiftUI.