You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Swift命令行工具终端/Xcode控制台粘贴输入失效问题求助

解决Swift命令行工具粘贴输入无效的问题

我之前也碰到过一模一样的坑!你当前用FileHandle.standardInput.availableData的读取方式有个核心问题:它是非阻塞式的,会立刻返回当前输入缓冲区里的所有数据,但粘贴内容时终端往往会分批发送数据,甚至还没等你粘贴完、按下确认回车,就已经完成了读取,导致只拿到部分内容甚至空数据。

下面给你两个靠谱的解决方案:

方案一:用系统原生的readLine()(首推)

这是Swift专门为命令行输入设计的API,它会阻塞等待直到用户按下回车键,不管是手动输入还是粘贴内容,都能完整捕获输入(还会自动忽略末尾的换行符)。修改你的getInput()函数如下:

func getInput() -> String {
    print("Enter the file path:")
    guard let input = readLine() else {
        fatalError("Failed to read user input")
    }
    return input
}

直接调用这个函数就能拿到用户输入的完整路径,粘贴操作完全正常。

方案二:改进FileHandle的读取逻辑(适合需要底层控制的场景)

如果因为某些原因必须用FileHandle,那需要循环读取直到检测到换行符(确认输入完成),确保拿到完整的粘贴内容:

func getInput() -> String {
    let keyboard = FileHandle.standardInput
    var inputData = Data()
    
    // 循环读取直到捕获到换行符,确认输入结束
    while true {
        let chunk = keyboard.availableData
        guard !chunk.isEmpty else {
            continue // 缓冲区无数据时等待后续内容
        }
        inputData.append(chunk)
        // 检查当前读取的内容是否包含换行符
        if let currentStr = String(data: inputData, encoding: .utf8), currentStr.contains("\n") {
            break
        }
    }
    
    guard let inputStr = String(data: inputData, encoding: .utf8) else {
        fatalError("Input is not valid UTF-8 format")
    }
    return inputStr.trimmingCharacters(in: .newlines)
}

小提示

不管用哪种方案,粘贴内容后都需要按下回车键来告诉程序输入已完成——这是命令行交互的标准行为,手动输入时也是一样的逻辑哦。

内容的提问来源于stack exchange,提问作者Omer Aam

火山引擎 最新活动