J'essaie d'obtenir l'entrée clavier pour une application de ligne de commande pour le nouveau langage de programmation Apple Swift.
J'ai scanné les documents en vain.
import Foundation
println("What is your name?")
???
Des idées?
swift
macos
cocoa
command-line
Chalkers
la source
la source
J'ai réussi à le comprendre sans tomber en C:
Ma solution est la suivante:
Les versions plus récentes de Xcode nécessitent un typage explicite (fonctionne dans Xcode 6.4):
la source
var input = NSString(data: NSFileHandle.fileHandleWithStandardInput().availableData, encoding:NSUTF8StringEncoding)
string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
Ce n'est en fait pas si simple, vous devez interagir avec l'API C. Il n'y a pas d'alternative à
scanf
. J'ai construit un petit exemple:main.swift
UserInput.c
cliinput-Bridging-Header.h
la source
edit Depuis Swift 2.2, la bibliothèque standard comprend
readLine
. Je noterai également que Swift est passé aux commentaires de document de démarque. Laissant ma réponse originale pour le contexte historique.Juste pour être complet, voici une implémentation Swift que
readln
j'utilise. Il a un paramètre facultatif pour indiquer le nombre maximal d'octets que vous souhaitez lire (qui peut ou non être la longueur de la chaîne).Cela démontre également l'utilisation correcte des commentaires swiftdoc - Swift générera un fichier <project> .swiftdoc et Xcode l'utilisera.
la source
En général, la fonction readLine () est utilisée pour analyser les entrées de la console. Mais cela ne fonctionnera pas dans un projet iOS normal tant que vous n'aurez pas ajouté "outil de ligne de commande" .
La meilleure façon de tester, vous pouvez faire:
1. Créez un fichier macOS
2. Utilisez la fonction readLine () pour analyser la chaîne facultative depuis la console
Production :
la source
Une autre alternative est de lier libedit pour une édition correcte des lignes (touches fléchées, etc.) et une prise en charge facultative de l'historique. Je voulais cela pour un projet que je démarre et j'ai rassemblé un exemple de base pour la façon dont je l'ai mis en place .
Utilisation de swift
Wrapper ObjC pour exposer libedit
la source
Voici un exemple simple de prise d'entrée de l'utilisateur sur une application basée sur la console: Vous pouvez utiliser readLine (). Prenez l'entrée de la console pour le premier numéro, puis appuyez sur Entrée. Après cela, saisissez le deuxième numéro comme indiqué dans l'image ci-dessous:
la source
Beaucoup de réponses dépassées à cette question. Depuis Swift 2+, la bibliothèque standard Swift contient la fonction readline () . Il renverra un Option mais il ne sera nul que si EOF a été atteint, ce qui ne se produira pas lors de l'obtention d'une entrée du clavier afin qu'il puisse être déballé en toute sécurité par la force dans ces scénarios. Si l'utilisateur n'entre rien, sa valeur (non emballée) sera une chaîne vide. Voici une petite fonction utilitaire qui utilise la récursivité pour inviter l'utilisateur jusqu'à ce qu'au moins un caractère ait été saisi:
Notez que l'utilisation de la liaison optionnelle (si let input = readLine ()) pour vérifier si quelque chose a été saisi comme proposé dans d'autres réponses n'aura pas l'effet souhaité, car il ne sera jamais nul et au moins "" lors de l'acceptation d'une saisie au clavier.
Cela ne fonctionnera pas dans un Playground ou dans tout autre environnement où vous n'avez pas accès à l'invite de commande. Il semble également avoir des problèmes dans la ligne de commande REPL.
la source
Je jure devant Dieu ... la solution à ce problème tout à fait fondamental m'a échappé pendant des ANNÉES. C'est tellement simple ... mais il y a tellement d'informations vagues / mauvaises là-bas; j'espère pouvoir sauver quelqu'un de certains des terriers sans fond dans lesquels je me suis retrouvé ...
Alors, obtenons une "chaîne" de "l'utilisateur" via "la console", via
stdin
, d' accord ?si vous le voulez SANS la nouvelle ligne de fin, ajoutez simplement ...
Ta Da!
♥ ⱥ ᏪℯⅩla source
Comme il n'y avait pas de solution sophistiquée à ce problème, j'ai créé une petite classe pour lire et analyser l'entrée standard dans Swift. Vous pouvez le trouver ici .
Exemple
Pour analyser:
Tu fais:
la source
Avant
*******************.
Correction
la source
Cela fonctionne dans xCode v6.2, je pense que c'est Swift v1.2
la source
Si vous souhaitez lire une chaîne séparée par des espaces et diviser immédiatement la chaîne en un tableau, vous pouvez le faire:
var arr = readLine()!.characters.split(" ").map(String.init)
par exemple.
la source
Lorsque la fonction readLine () est exécutée sur Xcode, la console de débogage attend l'entrée. Le reste du code reprendra une fois la saisie terminée.
la source
La réponse la mieux classée à cette question suggère d'utiliser la méthode readLine () pour prendre en compte les entrées de l'utilisateur à partir de la ligne de commande. Cependant, je tiens à noter que vous devez utiliser le! opérateur lors de l'appel de cette méthode pour renvoyer une chaîne au lieu d'un optionnel:
la source
readLine()
retourne optionnel pour une raison, il est donc dangereux de forcer le déballage et n'ajoute vraiment rien à l'exemple.Swift 5: Si vous voulez en permanence une entrée depuis le clavier, sans terminer le programme, comme un flux d'entrée, utilisez les étapes ci-dessous:
Créer un nouveau projet de type outil de ligne comnnad
Ajoutez le code ci-dessous dans le fichier main.swift:
la source
J'ai testé cela dans ObjC, et peut-être que ce sera utile.
la source
Je voulais juste commenter (je n'ai pas assez de représentants) sur l'implémentation de xenadu, car
CChar
sous OS X estInt8
, et Swift n'aime pas du tout lorsque vous ajoutez au tableau lorsque vousgetchar()
retournez des parties de UTF-8, ou toute autre chose au-dessus de 7 bits.J'utilise un tableau de à la
UInt8
place, et cela fonctionne très bien etString.fromCString
convertit très bien leUInt8
en UTF-8.Cependant c'est comme ça que je l'ai fait
la source
J'ai maintenant pu obtenir une entrée clavier dans Swift en utilisant ce qui suit:
Dans mon fichier main.swift, j'ai déclaré une variable i et lui ai assigné la fonction GetInt () que j'ai définie dans l'Objectif C. Grâce à ce qu'on appelle un en-tête de pont où j'ai déclaré le prototype de fonction pour GetInt, je pouvais créer un lien vers main.swift. Voici les fichiers:
main.swift:
En-tête de pontage:
obj.m:
Dans obj.m, il est possible d'inclure la sortie et l'entrée standard c, stdio.h, ainsi que la bibliothèque standard c stdlib.h qui vous permet de programmer en C dans Objective-C, ce qui signifie qu'il n'est pas nécessaire d'inclure un vrai fichier rapide comme user.c ou quelque chose comme ça.
J'espère que je pourrais aider
Edit: Il n'est pas possible d'obtenir une entrée String via C car ici j'utilise le CInt -> le type entier de C et non de Swift. Il n'y a pas de type Swift équivalent pour le caractère C *. Par conséquent, String n'est pas convertible en chaîne. Mais il y a assez de solutions ici pour obtenir une entrée String.
Raul
la source