Image de présentation d’un écran iOS illustrant les composants Textes en SwiftUI, un long texte est présent sur l'écran

Fruit Paradise (Exo)

Image de présentation d’un écran iOS illustrant les composants Textes en SwiftUI, un long texte est présent sur l'écran

Fruit Paradise (Exo)

Consigne

Sur cet exercice, on va simplement reprendre toutes les notions des cours précédents, à savoir les listes, les ScrollView et les conteneurs lazy comme LazyVStack et LazyHGrid.

L’idée est d’afficher une collection de fruits en format grille, comme indiqué sur la maquette, avec trois colonnes, et une liste qui doit être scrollable verticalement. Tu devras impérativement utiliser un ForEach et non une List, car, pour rappel, la List ne fonctionne pas dans un format en grille.

Pour cet exercice, j’ai volontairement ajouté beaucoup de données. Mais, pour une fois, je vais être sympa, je te fournis le modèle de données ainsi que le tableau déjà rempli.

Tu devras donc créer un fichier Swift nommé Fruit, et y coller le code suivant.


struct Fruit: Identifiable {
    let id = UUID()
    let imageName: String
    let name: String
    let origin: String
    let pricePerKg: Double
}

let fruits = [
    Fruit(imageName: "apple", name: "Apple", origin: "France", pricePerKg: 3.99),
    Fruit(imageName: "apricot", name: "Apricot", origin: "Spain", pricePerKg: 4.50),
    Fruit(imageName: "avocado", name: "Avocado", origin: "Mexico", pricePerKg: 6.99),
    Fruit(imageName: "banana", name: "Banana", origin: "Ecuador", pricePerKg: 2.30),
    Fruit(imageName: "blackberry", name: "Blackberry", origin: "USA", pricePerKg: 5.20),
    Fruit(imageName: "blueberry", name: "Blueberry", origin: "Canada", pricePerKg: 5.50),
    Fruit(imageName: "cherries", name: "Cherries", origin: "Italy", pricePerKg: 7.80),
    Fruit(imageName: "coconut", name: "Coconut", origin: "India", pricePerKg: 3.00),
    Fruit(imageName: "currant", name: "Currant", origin: "Germany", pricePerKg: 4.70),
    Fruit(imageName: "custard-apple", name: "Custard Apple", origin: "Brazil", pricePerKg: 8.90),
    Fruit(imageName: "dragonfruit", name: "Dragonfruit", origin: "Vietnam", pricePerKg: 9.50),
    Fruit(imageName: "fig", name: "Fig", origin: "Turkey", pricePerKg: 6.00),
    Fruit(imageName: "grapefruit", name: "Grapefruit", origin: "South Africa", pricePerKg: 4.10),
    Fruit(imageName: "grapes", name: "Grapes", origin: "Italy", pricePerKg: 3.90),
    Fruit(imageName: "khaki", name: "Khaki", origin: "Japan", pricePerKg: 5.70),
    Fruit(imageName: "kiwi", name: "Kiwi", origin: "New Zealand", pricePerKg: 6.30),
    Fruit(imageName: "lemon", name: "Lemon", origin: "Argentina", pricePerKg: 2.50),
    Fruit(imageName: "lime", name: "Lime", origin: "Mexico", pricePerKg: 2.80),
    Fruit(imageName: "lychee", name: "Lychee", origin: "China", pricePerKg: 7.00),
    Fruit(imageName: "mango", name: "Mango", origin: "India", pricePerKg: 5.20),
    Fruit(imageName: "medlar", name: "Medlar", origin: "Morocco", pricePerKg: 4.90),
    Fruit(imageName: "melon", name: "Melon", origin: "France", pricePerKg: 3.60),
    Fruit(imageName: "olives", name: "Olives", origin: "Greece", pricePerKg: 6.50),
    Fruit(imageName: "orange", name: "Orange", origin: "Spain", pricePerKg: 2.70),
    Fruit(imageName: "papaya", name: "Papaya", origin: "Brazil", pricePerKg: 6.80),
    Fruit(imageName: "passion-fruit", name: "Passion Fruit", origin: "Colombia", pricePerKg: 8.50),
    Fruit(imageName: "peach", name: "Peach", origin: "Italy", pricePerKg: 4.20),
    Fruit(imageName: "pear", name: "Pear", origin: "Netherlands", pricePerKg: 3.80),
    Fruit(imageName: "pineapple", name: "Pineapple", origin: "Costa Rica", pricePerKg: 5.00),
    Fruit(imageName: "plum", name: "Plum", origin: "USA", pricePerKg: 4.30),
    Fruit(imageName: "pomegranate", name: "Pomegranate", origin: "India", pricePerKg: 7.50),
    Fruit(imageName: "raspberry", name: "Raspberry", origin: "Scotland", pricePerKg: 8.00),
    Fruit(imageName: "star-apple", name: "Star Apple", origin: "Philippines", pricePerKg: 9.00),
    Fruit(imageName: "strawberry", name: "Strawberry", origin: "France", pricePerKg: 5.70),
    Fruit(imageName: "tangerine", name: "Tangerine", origin: "China", pricePerKg: 3.40),
    Fruit(imageName: "watermelon", name: "Watermelon", origin: "Turkey", pricePerKg: 1.90)
]

Maquette

capture d'écran dun iPhone qui représente un Text "helloworld"

. Trucs et astuce

L’IA est un formidable outil pour gagner du temps. Ici, pour créer le tableau de données, j’ai demandé à ChatGPT de me générer le tableau que je t’ai fourni à partir du modèle que je lui avais transmis. Je pense avoir gagné une heure de travail grâce à ça. Cette fois, je te le fournis directement, mais prends l’habitude d’utiliser des outils qui te feront gagner en productivité.

Pour tronquer un texte quand tu manques de place en SwiftUI, voici un petit tips : utilise une condition pour vérifier si le nombre de caractères dépasse la limite que tu souhaites (.count). Ensuite, tu peux utiliser la méthode prefix() pour garder uniquement les caractères souhaités et remplacer les derniers par un symbole (en général des points de suspension ).

Tu peux télécharger les images du projet ici :  Télécharger les images

Lien utile

Les listes

ScrollView

Lazy

LazyGrid

 Correction

Correction

Tips

Les composants et modificateurs se déprécient avec le temps ! Si si, ce n’est pas une blague, ils ont une durée de vie limitée. Alors, ce n’est pas exactement comme ça dans l’approche, mais en gros, certains modificateurs vont être remplacés par d’autres pour des raisons d’évolution ou de maintenance. C’est le cas dans tous les langages et frameworks.

Par exemple, en SwiftUI, si tu utilises .foregroundColor pour colorer tes vues, tu utilises un composant déprécié. Il est remplacé par .foregroundStyle. Mais quand on parle de “remplacement”, ce n’est pas tout à fait exact, sur les versions antérieures à iOS 17, ce modificateur n’existe pas. Cependant, si tu mets à jour une application vers iOS 17 ou plus, Apple va te recommander de mettre à jour ce modificateur pour garantir une meilleure compatibilité et évolutivité.

→ Comment savoir si un modificateur ou un composant est déprécié ?

Tu peux maintenir la touche Option ⌥ de ton clavier, puis cliquer sur le composant dans Xcode. Une pop-up apparaîtra avec des informations sur le statut du modificateur. Si celui-ci est déprécié, une alerte te sera donnée avec des suggestions de remplacement.

Ceci dit, pour rester au courant des évolutions de ton framework et de ton langage, tu dois faire une veille régulière. J’expliquerai plus en détail les meilleures techniques de veille dans un prochain tips !

Tips

Les composants et modificateurs se déprécient avec le temps ! Si si, ce n’est pas une blague, ils ont une durée de vie limitée. Alors, ce n’est pas exactement comme ça dans l’approche, mais en gros, certains modificateurs vont être remplacés par d’autres pour des raisons d’évolution ou de maintenance. C’est le cas dans tous les langages et frameworks.

Par exemple, en SwiftUI, si tu utilises .foregroundColor pour colorer tes vues, tu utilises un composant déprécié. Il est remplacé par .foregroundStyle. Mais quand on parle de “remplacement”, ce n’est pas tout à fait exact, sur les versions antérieures à iOS 17, ce modificateur n’existe pas. Cependant, si tu mets à jour une application vers iOS 17 ou plus, Apple va te recommander de mettre à jour ce modificateur pour garantir une meilleure compatibilité et évolutivité.

→ Comment savoir si un modificateur ou un composant est déprécié ?

Tu peux maintenir la touche Option ⌥ de ton clavier, puis cliquer sur le composant dans Xcode. Une pop-up apparaîtra avec des informations sur le statut du modificateur. Si celui-ci est déprécié, une alerte te sera donnée avec des suggestions de remplacement.

Ceci dit, pour rester au courant des évolutions de ton framework et de ton langage, tu dois faire une veille régulière. J’expliquerai plus en détail les meilleures techniques de veille dans un prochain tips !