Boucle infinie ?! -> Résolu!

Bonjour à tous,

(j’ai un peu merdé dans la création initiale du sujet et je n’ai pas su l’éditer ou le supprimer complètement ?! Alors je le réitère ci-dessous).

Voilà un code apparemment simple, destiné à mettre à l’épreuve le déballage de l’optionnel inputKeyboard en cas de nil (généré par un EOF, ctrl + D dans xCode).
Mais pourquoi cela génère-t-il une boucle infinie, car le repeat-While tourne bien, mais le readLine() sembble être ignoré à partir du premier ctrl + D saisi, et alors que j’espérais justement pouvoir ressaisir d’autres caractères valides.
Merci pour toutes infos :grinning:

    var isInputOk: Bool = false
    var compteur: Int = 0
    repeat {
        compteur += 1
        if let inputKeyboard = readLine() {
            print("Received any input OK")
            isInputOk = true
        } else {
            print("Received EOF before any input was given")
            isInputOk = false
        }
        print(compteur)
    } while isInputOk == false
    print("Sortie du while")

Je réponds à moi-même pour faire avancer le chmilblick :
La doc : Apple Developer Documentation dit :

Return Value : If EOF has already been reached when readLine() is called, the result is nil.

Nil for ever, ai-je envie de dire. Mais alors comment peut-on en sortir? C’est confusant :grin:

1 « J'aime »

A priori le CTRL-D signifie que l’utilisateur souhaite quitter l’app. C’est probablement pour ça que la saisie ne se réactive pas par la suite.
Si tu veux vérifier la saisie, tu peux le faire dans le cas où le readLine() te retourne une valeur : ça vaut le coup de vérifier cette valeur.
Si par contre la personne à utilisé le raccourcis CTRL-D, ça veut dire qu’elle souhaite quitter ton app et tu dois donc quitter au lieu de boucler :slight_smile:

Merci Maxime pour cette réponse. En fait l’app n’est pas quittée suite à CTRL-D, mais ça lance une boucle infinie avec le repeat-while sans re-solliciter une frappe clavier via readLine().
Comment produire par une absence de caractère avant le EOF?

Oui justement, tu reçois l’information que l’utilisateur souhaite quitter l’app, donc tu es censé sauvegarder les données puis quitter.
Tu ne dois surtout pas boucler si tu as reçu null comme réponse.
Si tu cherches à éviter les saisies vides il faut que tu compares le retour au texte "" pour dire si la saisie est invalide. Si le retour est nil alors tu dois quitter ton app (dans ton cas, tu dois sortir de la boucle et ne pas traiter la réponse)

Merci Maxime,

voilà finalement le code que j’ai retenu :

        guard var inputKeyboard = readLine(strippingNewline: true) else {
            print("Received EOF before any input was given")
            exit(0)
        }

// Received EOF before any input was given
// Program ended with exit code: 0

Note : Le raccourcis COMMAND + « . » (point) tue aussi radicalement l’application.
// Program ended with exit code: 9

1 « J'aime »