Ich versuche, die Tastatureingabe für eine Befehlszeilen-App für die neue Apple-Programmiersprache Swift zu erhalten.
Ich habe die Dokumente ohne Erfolg gescannt.
import Foundation
println("What is your name?")
???
Irgendwelche Ideen?
swift
macos
cocoa
command-line
Chalkers
quelle
quelle
Ich habe es geschafft, es herauszufinden, ohne zu C zu kommen:
Meine Lösung lautet wie folgt:
Neuere Versionen von Xcode benötigen eine explizite Typumwandlung (funktioniert in Xcode 6.4):
quelle
var input = NSString(data: NSFileHandle.fileHandleWithStandardInput().availableData, encoding:NSUTF8StringEncoding)
string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
Es ist eigentlich nicht so einfach, Sie müssen mit der C-API interagieren. Es gibt keine Alternative zu
scanf
. Ich habe ein kleines Beispiel gebaut:main.swift
UserInput.c
cliinput-Bridging-Header.h
quelle
Bearbeiten Ab Swift 2.2 enthält die Standardbibliothek
readLine
. Ich werde auch feststellen, dass Swift auf Markdown-Dokumentkommentare umgestellt hat. Ich lasse meine ursprüngliche Antwort für den historischen Kontext.Der Vollständigkeit halber hier eine Swift-Implementierung, die
readln
ich verwendet habe. Es verfügt über einen optionalen Parameter, der die maximale Anzahl von Bytes angibt, die Sie lesen möchten (dies kann die Länge des Strings sein oder nicht).Dies zeigt auch die ordnungsgemäße Verwendung von Swiftdoc-Kommentaren. Swift generiert eine <project> .swiftdoc-Datei und Xcode verwendet sie.
quelle
Eine andere Alternative besteht darin, libedit für eine ordnungsgemäße Zeilenbearbeitung (Pfeiltasten usw.) und optionale Verlaufsunterstützung zu verknüpfen . Ich wollte dies für ein Projekt, das ich gerade starte, und habe ein grundlegendes Beispiel für die Einrichtung zusammengestellt .
Verwendung von schnell
ObjC-Wrapper zum Offenlegen von libedit
quelle
Im Allgemeinen wird die Funktion readLine () zum Scannen von Eingaben von der Konsole verwendet. In normalen iOS-Projekten funktioniert dies jedoch erst, wenn Sie das Befehlszeilentool hinzufügen .
Der beste Weg zum Testen ist:
1. Erstellen Sie eine macOS-Datei
2. Verwenden Sie die Funktion readLine (), um optionale Zeichenfolgen von der Konsole aus zu scannen
Ausgabe :
quelle
Hier ist ein einfaches Beispiel für die Eingabe von Benutzern in einer konsolenbasierten Anwendung: Sie können readLine () verwenden. Nehmen Sie die Eingabe von der Konsole für die erste Nummer und drücken Sie die Eingabetaste. Geben Sie danach die zweite Zahl ein, wie im Bild unten gezeigt:
quelle
Ich schwöre bei Gott. Die Lösung dieses äußerst grundlegenden Problems entging mir JAHRE lang. Es ist so einfach ... aber es gibt so viele vage / schlechte Informationen da draußen; hoffentlich kann ich jemanden vor einigen der bodenlosen Kaninchenlöcher retten , in denen ich gelandet bin ...
Lassen Sie uns also einen "String" von "dem Benutzer" über "die Konsole" erhalten, über
stdin
, sollen wir ?Wenn Sie es OHNE den nachfolgenden Zeilenumbruch möchten, fügen Sie einfach ...
Ta Da!
♥ ⱥ ᏪℯⅩquelle
Viele veraltete Antworten auf diese Frage. Ab Swift 2+ enthält die Swift Standard Library die Funktion readline () . Es wird ein Optional zurückgegeben, aber es wird nur Null sein, wenn EOF erreicht wurde. Dies tritt nicht auf, wenn Eingaben von der Tastatur abgerufen werden, sodass es in diesen Szenarien sicher gewaltsam ausgepackt werden kann. Wenn der Benutzer nichts eingibt, ist sein (nicht verpackter) Wert eine leere Zeichenfolge. Hier ist eine kleine Dienstprogrammfunktion, die den Benutzer mithilfe der Rekursion auffordert, bis mindestens ein Zeichen eingegeben wurde:
Beachten Sie, dass die Verwendung der optionalen Bindung (wenn let input = readLine ()) zur Überprüfung, ob etwas wie in anderen Antworten vorgeschlagen eingegeben wurde, nicht den gewünschten Effekt hat, da es beim Akzeptieren von Tastatureingaben niemals Null und mindestens "" ist.
Dies funktioniert nicht auf einem Spielplatz oder in einer anderen Umgebung, in der Sie keinen Zugriff auf die Eingabeaufforderung haben. Es scheint auch Probleme in der Befehlszeile REPL zu geben.
quelle
Da es für dieses Problem keine ausgefallenen Lösungen gab, habe ich eine winzige Klasse erstellt, um die Standardeingabe in Swift zu lesen und zu analysieren. Sie finden es hier .
Beispiel
Zum Parsen:
Sie machen:
quelle
Vor
*******************.
Korrektur
quelle
Dies funktioniert in xCode v6.2, ich denke das ist Swift v1.2
quelle
Wenn Sie eine durch Leerzeichen getrennte Zeichenfolge lesen und die Zeichenfolge sofort in ein Array aufteilen möchten, haben Sie folgende Möglichkeiten:
var arr = readLine()!.characters.split(" ").map(String.init)
z.B.
quelle
Wenn die Funktion readLine () unter Xcode ausgeführt wird, wartet die Debug-Konsole auf die Eingabe. Der Rest des Codes wird nach erfolgter Eingabe fortgesetzt.
quelle
Die am besten bewertete Antwort auf diese Frage schlägt vor, die readLine () -Methode zu verwenden, um Benutzereingaben über die Befehlszeile zu erfassen. Ich möchte jedoch darauf hinweisen, dass Sie die! Operator beim Aufrufen dieser Methode, um eine Zeichenfolge anstelle einer optionalen zurückzugeben:
quelle
readLine()
aus einem bestimmten Grund optional zurückgegeben wird, ist daher das Force-Unwrap unsicher und fügt dem Beispiel nichts hinzu.Swift 5: Wenn Sie kontinuierlich Eingaben über die Tastatur wünschen, ohne das Programm wie einen Eingabestream zu beenden, führen Sie die folgenden Schritte aus:
Erstellen Sie ein neues Projekt vom Typ comnnad line tool
Fügen Sie den folgenden Code in die Datei main.swift ein:
quelle
Ich habe dies in ObjC getestet, und vielleicht ist dies nützlich.
quelle
Ich wollte nur die Implementierung von xenadu kommentieren (ich habe nicht genug Wiederholungen), weil dies
CChar
in OS X der Fall istInt8
und Swift es überhaupt nicht mag, wenn Sie dem Array wann hinzufügengetchar()
Teile von UTF-8 oder etwas anderes über 7 Bit zurückgegeben werden.Ich verwende
UInt8
stattdessen ein Array von , und es funktioniert großartig undString.fromCString
konvertiert dasUInt8
in UTF-8 ganz gut.Aber so habe ich es gemacht
quelle
Ich konnte jetzt Tastatureingaben in Swift mithilfe der folgenden Funktionen abrufen:
In meiner Datei main.swift habe ich eine Variable i deklariert und ihr die Funktion GetInt () zugewiesen, die ich in Ziel C definiert habe. Über einen sogenannten Bridging Header, in dem ich den Funktionsprototyp für GetInt deklariert habe, konnte ich eine Verknüpfung zu main.swift herstellen. Hier sind die Dateien:
main.swift:
Überbrückungskopfzeile:
obj.m:
In obj.m ist es möglich, die c-Standardausgabe und -eingabe stdio.h sowie die c-Standardbibliothek stdlib.h einzuschließen, mit der Sie in C in Objective-C programmieren können, sodass keine Einbeziehung erforderlich ist eine wirklich schnelle Datei wie user.c oder so ähnlich.
Hoffe ich konnte helfen,
Bearbeiten: Es ist nicht möglich, String-Eingaben über C zu erhalten, da ich hier das CInt -> den Integer-Typ von C und nicht von Swift verwende. Es gibt keinen äquivalenten Swift-Typ für das C-Zeichen *. Daher kann String nicht in String konvertiert werden. Aber es gibt hier ziemlich genug Lösungen, um String-Eingaben zu erhalten.
Raul
quelle