Cours POO Variables statiques

Une question de débutant

comment mémoriser le dernier PseudoUtilisé et le dernier score dans les variables statiques

import Foundation
import SwiftUI

class joueur {
static var dernierPseudoUtilise: String = «  »
static var nombreDeJoueursCrees: Int = 0

var pseudo: String
var score:Int

init(pseudo: String, score: Int) {
    self.pseudo = pseudo
    self.score = score
}


static func afficherStatistiques() {
    print("Dernier Pseudo: \(dernierPseudoUtilise) Score: \(nombreDeJoueursCrees)")
}

func affiche() {
    print("Pseudo: \(pseudo) - Score: \(score)")
}

}

merci pour vos réponses

Salut @michel.garlandat,

Quand tu uses « static », la variable est modifiable par la classe mais pas les objects a l’intérieur de cette classe.

Pour la modifier, tu peut utiliser :

    Joueur.dernierPseudoUtilise = “pseudo”
    Joueur.nombreDeJoueursCrees = 1

(Note la majuscule de Joueur, c’est le nom d’une classe, pas un nom de variable :wink:)

Pour changer la variable de l’intérieur de la classe, il faudra appeler :

override class var dernierPseudoUtilise: String {
        return “autre pseudo”
    }

Cedric

Merci pour ta réponse
Comment mettre directement dans la classe
Le dernier pseudo rentré dans dernierPseudoUtilise

Désolé mais je ne comprends pas trop ce que tu veux faire… peut être avec plus de code ?

je voudrais qu’ a chaque fois que l’on fait appel à la classe joueur
le dernierPseudoUtilisé soit mis à jour ainsi que le nombre de joueurs créés

Bonsoir,
Quelque chose comme ça ? (fait rapidement sur Playgrounds et non testé)

À chaque fois que tu crées un joueur, ça incrémente le nombre total de joueurs
À chaque fois que tu appelles la fonction doSomethingThatChangesTheLastPseudo, ça modifie le dernier pseudo utilisé

Cordialement
Nicolas

import Foundation


class Joueur {
    static var dernierPseudoUtilise: String = ""
    static var nombreDeJoueursCrees: Int = 0
    
    var pseudo: String
    var score:Int
    
    init(pseudo: String, score: Int) {
        self.pseudo = pseudo
        self.score = score
        Joueur.nombreDeJoueursCrees += 1
    }
    
    func doSomethingThatChangesTheLastPseudo() {
        // do what you have to do
        Joueur.dernierPseudoUtilise = self.pseudo
    }
    
    static func afficherStatistiques() {
        print("Dernier Pseudo: \(dernierPseudoUtilise) Score: \(nombreDeJoueursCrees)")
    }
    
    func affiche() {
        print("Pseudo: \(pseudo) - Score: \(score)")
    }
}



Joueur.nombreDeJoueursCrees // 0

let joueur = Joueur(pseudo: « toto », score: 20)

Joueur.nombreDeJoueursCrees // 1

Et je ne sais plus comment insérer du code dans un post :crazy_face:

ça y est :expressionless:

Ton code n’est pas sécurisé. Si je comprend bien, les données de la classe Joueur sont définis à la création et ne doivent être accessibles qu’en lecture par la suite.

Il faut passer par des variables intermédiaires et des geters pour créer des variables ne pouvant être modifiés. Comme ça :

class Joueur {

  private static var _nombreDeJoueursCrees: Int = 0
  private static var _dernierPseudoUtilise: String = ""
  private var _pseudo:String = ""
  private var _score : Int = 0
  
  var dernierPseudoUtilise: String {
    get { return Joueur._dernierPseudoUtilise }
  }
  
  var nombreDeJoueursCrees: Int {
    get { return Joueur._nombreDeJoueursCrees }
  }
  
  var pseudo: String {
    get { return _pseudo }
  }
  
  var score:Int {
    get { return _score }
  }
  
  init (pseudo: String, score: Int) {
    self ._pseudo = pseudo
    self ._score  = score
    Joueur._dernierPseudoUtilise = pseudo
    Joueur._nombreDeJoueursCrees += 1
  }
}

Code non testé, mais qui compile normalement. Je ferais une mini-application en SwiftUI pour tester correctement, demain …

1 J'aime

Merci pour vos réponses et à Draken comme d’habitude
Est fait cela était évoqué dans le cours de Maxime sur la Poo mais je n’arrivais pas à le mettre en pratique

1 J'aime

Ah oui !! Désolé @michel.garlandat :man_facepalming:
J’ai eu du mal a comprendre l’interêt du code…

A priori, ce n’est pas du vrai code de production, mais un exemple éducatif pour illustrer/tester un concept.

Oui, je me doutais. Et j’ai encore beaucoup a apprendre moi meme ! :+1:

Nous sommes beaucoup dans ce cas
C’est pour ça que nous sommes là :blush:

Voila ce que je voulais faire en définitive pour tester le principe

import Foundation
import SwiftUI

class Joueur {
private static var _dernierPseudoUtilise: String = «  »
private static var _nombreDeJoueursCrees: Int = 0

var dernierPseudoUtilise: String {
    get { return Joueur._dernierPseudoUtilise}
}

var nombreDeJoueursCrees: Int {
    get { return Joueur._nombreDeJoueursCrees}
}

private var _pseudo: String = ""
var pseudo: String {
    get { _pseudo }
    set { _pseudo = newValue}
}

private var _score:Int
var score: Int {
    get { _score}
    set { _score = max(0,newValue) }
}

init(pseudo: String, score: Int) {
    self._pseudo = pseudo
    self._score = score
    Joueur._dernierPseudoUtilise = pseudo
    Joueur._nombreDeJoueursCrees += 1
}


static func afficherStatistiques() {
    print("Dernier Pseudo: \(_dernierPseudoUtilise) Nombre de joueurs créés: \(_nombreDeJoueursCrees)")
}

func affiche() {
    print("Pseudo: \(pseudo) - Score: \(score)")
}

}

let ahmed = Joueur(pseudo: « Ahmed », score: 2)
let michel = Joueur(pseudo: « Michel », score: 3)
let toto = Joueur(pseudo: « toto », score: 4)
print(ahmed.affiche())
//Plus d’accès aux variables locales
//Joueur.dernierPseudoUtilise = « fff »
print(Joueur.afficherStatistiques())

Affichage

Pseudo: Ahmed - Score: 2
Dernier Pseudo: toto Nombre de joueurs créés: 3

1 J'aime

Je ne me rappelle plus exactement mais je suis quasiment certain que j’ai aussi précisé de n’utiliser les variables statiques que dans de très rares cas et principalement pour des constantes.
Les variables statiques doivent être utilisées avec parcimonie au risque de te compliquer la vie sur ton projet.
Par exemple tes objets joueurs auront trop de responsabilités maintenant qu’ils gèrent les données des autres joueurs en plus de leurs données propres
Il vaut mieux créer un objet en amont qui gérera ta liste de joueurs et qui aura donc la possibilité de les compter, trouver le dernier pseudo, etc. Sans aucune variable statique :slight_smile:

1 J'aime

Bien compris

mais c’était simplement la mise en application de ton cours sur la POO

2 J'aimes

Perso, je n’ai jamais utilisé de variables Static (ou cela ne m’a pas laissé de souvenirs).
Il m’arrive parfois d’employer des fonctions Static dans une classe (ce qui est très différent des variables Static), pour régler des problèmes d’initialisation. Et c’est tout …