如何在Swift playground中使用STDIN

8

我知道在 STDIN 和 STDOUT 中编程,我们需要在 Xcode 中创建一个命令行项目。但是在 Playground 中如何获取标准输入?

每当我尝试在 Playground 中运行这样的代码时,

var input = readLine()!

我经常遇到这个错误

执行被中断,原因:EXC_BAD_INSTRUCTION(代码=EXC_l386_INVOP,子代码=0x0)

在playground中是否可以使用STDIN?

更新

我知道这个错误是由于nilinput变量引起的,但我想知道如何克服这个nil值。


不是这样的 - 我想知道在 playground 中如何使用 STDIN,那个问题有点不同。@HenrikGustafsson - Vinod Rathod
根据我的测试,目前你无法这样做。你需要创建一个命令行工具。或者你可以创建一个带有“单视图”的playground,添加一个UITextView和一个输入按钮,然后通过那种方式实现。祝你好运! - uplearned.com
6个回答

7

SWIFT 3的固定解决方案

为了让其工作,创建一个新的命令行工具项目。

转到“文件” -> “新建” -> “项目” -> “macOS” -> “命令行工具”。

import Foundation

print("Hello, World!")


func solveMefirst(firstNo: Int , secondNo: Int) -> Int {
    return firstNo + secondNo
}

func input() -> String {
    let keyboard = FileHandle.standardInput
    let inputData = keyboard.availableData
    return NSString(data: inputData, encoding:String.Encoding.utf8.rawValue) as! String
}

let num1 = readLine()
let num2 = readLine()

var IntNum1 = Int(num1!)
var IntNum2 = Int(num2!)

print("Addition of numbers is :  \(solveMefirst(firstNo: IntNum1!, secondNo: IntNum2!))")

使用 CMD + R 运行该项目。


4

Playground无法从命令行读取输入。

您可以使用自定义的“readLine()”函数和全局输入变量,其中输入数组中的每个元素表示一行:

import Foundation

var currentLine = 0
let input = ["5", "5 6 3"]

func readLine() -> String? {
    if currentLine < input.endIndex {
        let line = input[currentLine]
        currentLine += 1
        return line
    } else {
        return nil
    }
}

let firstLine = readLine() //  5
let secondLine = readLine() // 5 6 3
let thirdLine = readLine() // nil

2
这是一个非常好的解决方案,适用于在HackerRank等网站上使用Xcode Playground来编写代码。 - Mark Gerrior

2

尝试使用可选链

if let input = readLine() {
    print("Input: \(input)")
} else {
    print("No input.")
}

显然,这将在 playground 中打印出 "No input.\n"。但这不能成为我的问题的答案。是的,这是个不错的技巧。 - Vinod Rathod
据我所知,无法从playground使用标准输入。这只是解决nil问题的一种方法。但是,在playground之外运行它应该可以正常工作。 - Henrik Gustafsson
你能告诉我为什么这段代码在playground中可以工作 var input = readLine(),而这段代码却不行 var input = readLine()! - Vinod Rathod
@VinodRathod 在我的游乐场(Xcode 7.2.1)中,“它永远运行”(因此readLine不返回)。 - user3441734

0
private var lines: IndexingIterator<[String]>?

public var file: String? {
    didSet {
        lines = file?.split(separator: "\n").map(String.init).makeIterator()
    }
}

public func readLine() -> String? {
    lines?.next()
}

0

前往

新建 > 项目 > MacOs > 命令行工具

然后您可以应用:

let value1: String?

value1 = readLine()
print(value1 ?? "")

"" 是默认值


-1

如果需要从命令行获取输入,例如Console.ReadLine... Chalkers提供了以下解决方案。

func input() -> String {
    var keyboard = NSFileHandle.fileHandleWithStandardInput()
    var inputData = keyboard.availableData
    return NSString(data: inputData, encoding:NSUTF8StringEncoding) as! String
}

如果这个不起作用,请进一步询问 Vinod。


这个程序相关的内容需要翻译为中文:没有这个函数 input() 和 readLine() 是一样的。我关心的是如何在 playground 中从用户获取标准输入。 - Vinod Rathod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接