我试图在Swift中重新创建Python的input()
语句,我已经看到了一些例子,但我试图让它变得更好,首先,我的版本删除了\n
部分字符串,也是,我试图让它首先打印一个提示,以便var example = input()
只等待消息(它确实如此),但然后var example = input("Enter text: ")
将打印Enter text:
并等待文本被输入。
问题是,swift似乎搞乱了印刷品的订单。例如,作为代码:
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).")
输入文字" hi",打印:
Creating the input statement in Swift!
hi
What's your name: You entered: hi.
我的期望是:
Creating the input statement in Swift!
What's your name: hi
You entered: hi.
我在这里缺少什么?
由于
答案 0 :(得分:0)
问题是标准输出文件描述符是行缓冲 写入终端时(否则完全缓冲)。 因此输出
print(inputStatement, terminator:"")
是缓冲的,不会在
之前写入print()
写一个换行符。你可以通过刷新文件来解决这个问题 显式描述符:
if let inputStatement = inputStatement {
print(inputStatement, terminator:"")
fflush(stdout)
}
还要注意有一个
public func readLine(stripNewline stripNewline: Bool = default) -> String?
从标准输入读取一行,选项为 删除尾随换行符。这个功能也 刷新标准输出。因此,更简单的实现将是
func input(prompt: String = "") -> String {
print(prompt, terminator: "")
guard let reply = readLine(stripNewline: true) else {
fatalError("Unexpected EOF on input")
}
return reply
}
(当然你可以选择以不同的方式处理“文件结尾”。)