在Swift中重新创建Python的输入语句

时间:2016-04-17 09:58:29

标签: ios swift

我试图在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.

我在这里缺少什么?

由于

1 个答案:

答案 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
}

(当然你可以选择以不同的方式处理“文件结尾”。)