Formation PUB900 : Développer une application pour iPhone avec SwiftUI, H-2024 Le langage Swift (référence)

61.1 Variables, constantes et types de données


Dans cette fiche :

Déclaration

Avec Swift, les mots-clés var et let permettent de déclarer respectivement des variables et des constantes.

  • var : déclare une variable
  • let : déclare une constante
Swift

var nom = "Annie"
let iterations = 10

Lorsque le type peut être déduit à partir de la valeur d'initialisation, Swift effectue automatiquement une inférence de type. Il n’est donc pas nécessaire de préciser le type, comme dans l'exemple précédent.

Si désiré, il est tout de même possible de spécifier le type.

Swift

var nom: String = "Annie"
let iterations: Int = 10

Dans le cas où le type de la variable ne peut pas être déterminé automatiquement, il est obligatoire de le préciser.

Swift

var nom: String
var montant: Decimal = 10.99   // sans le type, la variable aurait été de type Double

Types de base

Les types de base en Swift sont :

  • Int : nombre entier.
    Il est également possible de spécifier sur combien de bits on désire stocker le nombre, par exemple 32 bits ou 64 bits, avec Int32 et Int64. Ceci affectera les valeurs minimales et maximales qui peuvent être stockées.
    Int32 : -2147483648 à 2147483647
    Int64 : -9223372036854775808 à 9223372036854775807
    Cette précision n'est généralement pas nécessaire. Si vous travaillez sur un système en 64 bits, Int fera la même chose que Int64.
  • UInt : Nombre entier non signé (Unsigned)
  • Double : Nombre à virgule flottante codé sur 64 bits (15 décimales) - idéal pour calcul scientifique
  • Float : Nombre à virgule flottante codé sur 32 bits (6 décimales) - idéal pour jeux, graphiques, animation
  • Bool : Booléen
  • String : chaîne de caractères.

Fait intéressant : on peut convertir une chaîne de caractères en tableau comme suit :

Swift

let tableauLettres = Array(nom) // ["A", "n", "n", "i", "e"]

Type Decimal

Si vous développez une application qui doit travailler avec des valeurs monétaires, le type par excellence est Decimal.

Decimal évite les erreurs d’arrondi associées aux nombres à virgule flottante.

Swift

let prix: Decimal = 69.44

Si on initialise une variable de type Decimal à partir d'une chaîne, il faut tenir compte que le résultat pourrait être nil si la chaîne n'était pas conforme.

Dans cet exemple, il est sécuritaire d'utiliser l'opérateur de déballage forcé (!) puisque la chaîne est codée en dur et qu'on est certains que la valeur pourra être convertie en Decimal.

Swift

let prix = Decimal(string: "69.44")!

Dans d'autres contextes, il est préférable d'utiliser if let.

Swift

if let prix = Decimal(string: prixSaisi) {
  // ici, on a l'assurance que le prix est valide.
} else {
  message = "Veuillez spécifier un prix valide (ex : 12.50)"
}

Notez que pour convertir une chaîne en Decimal, ceci ne fonctionne pas car la structure Decimal n'a pas de constructeur avec un paramètre non nommé de type String.

Swift

let montantTexte = "12.25"
if let montantDecimal = Decimal(montantTexte) {
  ...

}

Pour que ça fonctionne, il faut préciser que le nom du premier paramètre est string.

Swift

let montantTexte = "12.25"
if let montantDecimal = Decimal(string: montantTexte) {
  ...
}

Type CGFloat

Le type CGFloat est très utilisé dans le développement d’interfaces graphiques. Il représente un nombre à virgule flottante optimisé pour les calculs graphiques.

SwiftUI utilise CGFloat pour :

  • les positions (x, y)
  • les tailles (width, height)
  • les angles
  • les coordonnées dans l’espace graphique
SwiftUI

let largeur: CGFloat = 120
let opacite: CGFloat = 0.5

Techniquement, CGFloat est très proche de Double. Son avantage est qu'il s'adapte automatiquement à l'architecture de l'appareil (32 ou 64 bits).

Dans cet exemple, les paramètres pour .frame() et pour .opacity() sont automatiquement convertis en CGFloat.

SwiftUI

Circle()
  .frame(width: 100, height: 100)
  .opacity(0.5)

Par contre, si les valeurs étaient lues dans des variables, il faudrait s'assurer que le type de la variable est correctement spécifié ou qu'il a été correctement inféré.

SwiftUI

let largeur = 100 // ici, le type inféré est Int
...
Circle()
  .frame(width: largeur)   // erreur : Cannot convert value of type 'Int' to expected argument type 'CGFloat'

Pour régler ce problème, plusieurs approches sont possibles :

SwiftUI

let largeur: CGFloat = 100
...
Circle()
  .frame(width: largeur)

ou

SwiftUI

let largeur = 100
...
Circle()
  .frame(width: CGFloat(largeur))

ou encore

SwiftUI

let largeur = 100.0   // ici, le type inféré est Double
...
Circle()
  .frame(width: largeur)   // SwiftUI est souvent capable de faire une conversion automatique entre Double et CGFloat

 

Instances de structures et de classes

Les mots-clés var et let permettent également de déclarer des instances de structures et de classes.

Petite mise en garde : si une instance d'une structure est déclarée avec let, l’instance devient entièrement immuable.

L'instance ainsi que toutes ses propriétés ne pourront pas être réassignées.

Swift

let monInstance = MaStructure()
monInstance.unePropriete = "abc"   

Ce code générera l'erreur « Cannot assign to property: 'monInstance' is a 'let' constant ».

Cannot assign to property: 'monInstance' is a 'let' constant

Notez que ce comportement est différent de ce qu'on retrouve dans d'autres langages, par exemple JavaScript.

Les classes réagissent différemment.

Swift

let monInstance = MaClasse()
monInstance.unePropriete = "abc" 

Lorsqu'on a une instance d'une classe, il est possible de modifier ses propriétés même si l'instance a été déclarée avec let, à condition que la propriété ait elle-même été déclarée avec var dans la classe.

Types opaques

Quand on déclare une variable, il est possible de lui donner un type opaque, c'est-à-dire de ne pas spécifier le type précis d'une variable.

Ceci sera fait à l'aide du mot-clé some suivi d'un protocole.

SwiftUI

var body: some View {
  ...
}

Ici, on voit que la variable body est d'un type qui répond au protocole View mais on ne connaît pas son type précis. Ce pourrait être un Text, un VStack, etc.

Sans entrer dans les détails techniques, disons que les types opaques permettent de régler une problématique en n'exposant pas le type précis d'une variable.

À quel endroit déclarer les variables dans SwiftUI?

Les variables et constantes qui doivent être utilisées dans toute une vue seront déclarées directement dans la structure de la vue, avant le body.

Dans l'exemple qui suit, le contexte dicte qu'on doit utiliser une constante.

SwiftUI

struct ContentView: View {
  let nom: String = "Annie"

  var body: some View {
    ...
  }
}

Il est possible de déclarer les variables et constantes avec une portée plus petite, par exemple direction dans l'action d'un bouton.

La variable ou constante n'existera pas en dehors du code de ce bouton.

SwiftUI

Button(action: {
  var nom: String = "Annie"
  ...
}) {
  Text("Vérifier")
}

Pour plus d'information

« The Basics - Constants and Variables ». Swift. https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html#ID310

« Swift Integer Quick Guide ». Use Your Loaf. https://useyourloaf.com/blog/swift-integer-quick-guide/

« Swift – Integer, Floating-Point Numbers ». Geeks for Geeks. https://www.geeksforgeeks.org/swift-integer-floating-point-numbers/

« Constants, Variables and Types ». Dimitri Racordon. https://kyouko-taiga.github.io/swift-thoughts/tutorial/chapter-1/

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre