2016-04-17 4 views
2

Ich versuchte, Python input()-Anweisung in Swift neu zu erstellen, habe ich einige Beispiele gesehen, aber ich versuche es besser zu machen, erstens entfernt meine Version die \n Teil der Zeichenfolge, auch ich versuchte, es zunächst drucken eine Aufforderung, so dass var example = input() würde nur auf die Nachricht warten, (was es tut), aber dann var example = input("Enter text: ") würde drucken Enter text: und warten auf Text eingegeben werden.Python Eingabeanweisung in Swift

Das Problem ist, scheint schnell die Ordnung des Druckes zu vermasseln. Zum Beispiel der Code sein:

import Foundation 

func input(inputStatement: String? = nil) -> String { 
    if let inputStatement = inputStatement { 
     print(inputStatement, terminator:"") 
    } 
    let keyboard = NSFileHandle.fileHandleWithStandardInput() 
    let inputData = keyboard.availableData 
    var strData = NSString(data: inputData, encoding: NSUTF8StringEncoding) as! String 
    strData = strData.stringByReplacingOccurrencesOfString("\n", withString: "") 
    print() 
    return strData 
} 

print("Creating the input statement in Swift!") 
var test = input("What's your name: ") 
print("You entered: \(test).") 

Und die Eingabe von Text, "hallo", diese Drucke:

Creating the input statement in Swift! 
hi 
What's your name: You entered: hi. 

Und was ich erwartet wurde:

Creating the input statement in Swift! 
What's your name: hi 
You entered: hi. 

Was bin ich fehlt Hier?

Dank

+0

print ("Wie ist Ihr Name:. \ (Test)") – Lion

+0

@Lion Nein , Ich möchte es nicht drucken, ich möchte, dass es die inputStatement mit einem Abschlusszeichen von "", so dass wenn ich die Eingabe schreibe, wird es nach der Aufforderung schreiben. Und ich bin mir ziemlich sicher, wenn ich das machen wollte, wäre es: 'print (" Wie heißt du: \ (test). ")' 'Nicht' print ("Wie heißt du: (test).") '. –

Antwort

0

Das Problem ist, dass die Standardausgabe Dateideskriptor Linie gepuffert ist, wenn an einem Endgerät (Fully Buffered und anderweitig) zu schreiben. Deshalb ist die Ausgabe von

print(inputStatement, terminator:"") 

wird gepuffert und nicht geschrieben, bevor die

print() 

eine neue Zeile schreibt. Sie können das Problem beheben, indem Sie die Datei Descriptor Spülung ausdrücklich:

if let inputStatement = inputStatement { 
    print(inputStatement, terminator:"") 
    fflush(stdout) 
} 

Beachten Sie auch, dass es eine

public func readLine(stripNewline stripNewline: Bool = default) -> String? 

ist, die eine Linie von der Standardeingabe liest, mit der Option, entfernen Sie die hintere Newline-Zeichen . Diese Funktion spült auch die Standardausgabe . Daher ist eine einfachere Implementierung

func input(prompt: String = "") -> String { 
    print(prompt, terminator: "") 
    guard let reply = readLine(stripNewline: true) else { 
     fatalError("Unexpected EOF on input") 
    } 
    return reply 
} 

sein würde (natürlich Sie können wählen, "das Ende der Datei" unterschiedlich zu behandeln.)

+0

Super, das hat den Trick gemacht. Vielen Dank! –

+0

@TiagoFerreira: Gern geschehen! –