Ta fonction demandeValeurs() affiche un texte et demande une valeur qui ne sert à RIEN ! Elle n’est pas testée, ni stockée en mémoire, juste affichée une fois. C’est une variable LOCALE, elle est détruite quand le programme sort du corps de la fonction. Pas étonnant que la boucle ne fonctionne pas.
Pour chaque itération de la boucle, ton code consulte le clavier DEUX fois : dans le corps de la fonction demandeValeurs(), et après l’instruction while. Si la valeur 0 est saisie dans la demandeValeurs() l’information est DETRUITE sans être utilisée !
Pour que ton code marche, il faut que demandeValeurs() transmettre l’information au reste de l’application. Le plus simple c’est qu’elle retourne la valeur lue.
func demandeValeurs() -> Int {
let valeur: Int
print("Quelle est votre valeur ?")
valeur = Utilisateur.saisirEntier()
print("Votre valeur est \(valeur)")
return valeur
}
Dans ce cas, la boucle peut être écrite d’une manière très concise :
repeat {
} while demandeValeurs() != 0
Ou dans une version plus verbeuse :
var choix:Int
repeat {
choix = demandeValeurs()
} while choix != 0
J’ai testé, cela fonctionne. Enfin disons plutôt que j’ai “simulé” la saisie utilisateur. J’ai horreur de playgrounds qui me rappelle mes cauchemars d’enfance avec la ligne de commande de MS-DOS.
Je fait mes petits bricolages avec du vrai code, dans du vrai Xcode. J’ai remplacé la saisie clavier avec une petite routine retournant une valeur aléatoire compris entre 0 et 10.
Voici le code réel que j’ai testé, dans une micro-application iOS :
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print ("***Début de la boucle")
var choix:Int
repeat {
choix = demandeValeur()
} while choix != 0
print ("***Fin de la boucle")
}
// SimulationSaisieUtilisateur
// Nombre aléatoire compris entre 0 et 9
func utilisateurSaisieEntier() -> Int {
return Int(arc4random_uniform(10))
}
func demandeValeur() -> Int {
let valeur:Int
print ("Quelle est votre valeur ? ")
valeur = utilisateurSaisieEntier()
print ("Votre valeur est : ", valeur)
return valeur
}
}
Exemple de log :
***Début de la boucle
Quelle est votre valeur ?
Votre valeur est : 3
Quelle est votre valeur ?
Votre valeur est : 4
Quelle est votre valeur ?
Votre valeur est : 8
Quelle est votre valeur ?
Votre valeur est : 0
***Fin de la boucle