【问题标题】:How to take STDIN in Swift playground如何在 Swift 操场上使用 STDIN
【发布时间】:2016-05-24 15:35:57
【问题描述】:

我知道要在 STDIN 和 STDOUT 中编程,我们需要在 Xcode 中创建一个命令行项目。 但是我如何在操场上接受标准输入。

每当我尝试在操场上运行此类代码时

var input = readLine()!

我总是收到这个错误

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

是否可以在操场上使用 STDIN?

更新

我知道这个错误是因为 nil input 变量,但想知道如何克服这个 nil 值。

【问题讨论】:

标签: ios xcode swift swift2 swift-playground


【解决方案1】:

对于从命令行获取输入,如 Console.ReadLine...Chalkers 有如下解决方案。

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

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

【讨论】:

  • no 这个函数 input() 和 readLine() 一样。我担心如何在操场上从用户那里获取标准输入
【解决方案2】:

尝试使用Optional Chaining

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

【讨论】:

  • 显然这将在操场上打印“No input.\n”。但这不能成为我问题的答案。是的,这是个好把戏
  • 据我所知,无法使用来自 Playground 的标准输入。这只是解决 nil 问题的一种方法。但是,一旦您在操场外运行它,它应该可以工作。
  • 你能告诉我为什么这段代码可以在var input = readLine() 工作,为什么在操场上这个var input = readLine()! 不行。
  • @VinodRathod 在我的操场上(Xcode 7.2.1)它“运行前卫”(所以 readLine 不会返回)
【解决方案3】:

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】:

    前往

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

    那么你就可以申请了:

    让 value1: 字符串?

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

    "" 为默认值

    【讨论】:

      【解决方案5】:

      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
      

      【讨论】:

      • 当您使用 Xcode Playground 处理代码时,这是在 HackerRank 等网站上使用的绝佳解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多