Ça y est ! Nos classes commencent à ressembler à quelque chose. On a même enfin un bus qui roule le long de la route ! Elle est pas belle la vie ? Mais bon, je vous connais, vous en voulez encore. Alors dans ce chapitre je vais vous montrer quelque chose qui va nous être bien pratique : les propriétés et méthodes de classe.
Hé mais on connaît déjà ça !
Non… pas tout à fait. Vous connaissez en effet les propriétés et les méthodes. Mais la forme sous laquelle vous les connaissez pour l'instant s'appelle les propriétés et méthodes d'instance ! Pourquoi d'instance ? Parce qu'on les utilise sur des instances.
Créer et utiliser les propriétés et méthodes de classe
Par exemple, la méthodedrive
que vous venez de créer dans le chapitre précédent, vous l'utilisez sur une instance : l'instance unBus en l'occurrence :
unBus.drive(road: road)
Avec une méthode ou une propriété de classe, on utilise directement la classe, comme ceci :
Bus.propriétéDeClasse()
Bus.methodeDeClasse()
On appelle directement la méthode ou la propriété avec le nom de la classe.
Pour créer une méthode ou une propriété de classe. On utilise le mot cléstatic
avant la déclaration comme ceci :
class MaClasse {
static var unePropriétéDeClasse = 0
static func uneMéthodeDeClasse() {
// Ici se trouve les instructions de la méthode
}
}
MaClasse.unePropriétéDeClasse // J'accède à la propriété de classe
MaClasse.uneMéthodeDeClasse() // J'appelle la méthode de classe
Donc rien de plus simple, il suffit d'ajouter le mot-cléstatic
pour passer d'une propriété ou méthode d'instance à une propriété ou méthode de classe.
Utilité des propriétés et méthodes de classe
Holà ! Tout doux mon garçon ! C'est formidable ton histoire, mais ça sert à quoi ?
À rien... !
Non bien sûr que non et c'est même très pratique. Laissez-moi vous montrer quelques cas d'utilisation.
Les constantes
Souvent, dans une classe, on va vouloir définir des constantes qui sont vraies pour toutes les instances de la classe. Par exemple, le type Float en a plusieurs :
Float.infinity // contient le plus grand nombre décimal pouvant être contenu dans un float
Float.pi // Contient le nombre pi
Ça n'aurait pas de sens de devoir d'abord créer une instance de float avant d'accéder à ces valeurs. On préfère y avoir accès directement. Mais il faut bien le stocker quelque part et quoi de plus logique que de le stocker dans le typeFloat
puisquepi
et l'infini sont a priori décimaux.
Autre exemple, dans notre cas, cela va nous permettre de stocker le nombre maximum de sections que peut contenir la route. En effet, le canevas ayant une taille limitée, on ne peut pas afficher plus de 77 sections de route. Donc nous allons utiliser une propriété de classe pour cela :
class Road {
static let maxLength = 77
// La suite de la classe...
}
Petit exercice au passage, je vous propose de modifier l'init de la classeRoad
pour contrôler que les instances créées ont pour longueur maximum 77.
// Ne regardez pas la correction tout de suite !
class Road {
static let maxLength = 77
var sections = [RoadSection]()
init(length: Int) {
var length = length
if length > Road.maxLength {
length = Road.maxLength
}
for _ in 0..<length {
self.sections.append(RoadSection())
}
}
}
Les initialisations particulières
On peut utiliser les méthodes de classe pour initialiser des instances particulières facilement. Vous avez sans doute remarqué maintenant que la route que l'on crée fait des virages pour se poursuivre. On pourrait créer une méthode de classecreateStraightRoad
qui crée une route toute droite. Pour cela, il suffit de lui donner une longueur inférieure à 12 sections pour ne pas atteindre le premier virage.
class Road {
static func createStraightRoad() -> Road {
return Road(length: 11)
}
// (...)
}
Road.createStraightRoad() // Le canevas affiche une ligne droite
Cette fonction renvoie bien une route droite de longueur 11.
Gérer plusieurs instances
Certaines méthodes de classe sont utilisées pour faire des calculs ou des modifications sur plusieurs instances en même temps. Par exemple, si on voulait combiner deux instances deRoad
en une seule pour avoir une plus grande route, on écrirait sans doute une méthode de classe.
Autre exemple, les typesFloat
etDouble
ont comme méthode de classemaximum
qui permet d'obtenir la valeur absolue d'un nombre :
Double.maximum(2, 12) // Renvoie 12
Float.maximum(3, 13) // Renvoie 13
Exercice
Houston... ?
You are not signed in
Sign in to access coding exercises and test your new skills.
En résumé
Les propriétés et méthodes de classe se déclarent avec le mot-clé
static
.Par opposition à une propriété ou méthode d'instance, une propriété ou méthode de classe s'utilise à partir du nom de la classe.
Les propriétés de classe sont particulièrement utiles pour définir des constantes pour la classe.
Les méthodes de classe sont particulièrement utiles pour définir des initialisations particulières ou pour gérer plusieurs instances.