【问题标题】:How to read user input or stdin in Swift for Linux?如何在 Swift for Linux 中读取用户输入或标准输入?
【发布时间】:2015-12-06 10:11:00
【问题描述】:

如何在 Swift for Linux 中从标准输入读取用户输入或字符流?

【问题讨论】:

标签: linux swift


【解决方案1】:

readLine() 适用于 Ubuntu 15:

[Readline] 返回Characters 从标准输入读取到结束 当前行或直到到达 EOF,或 nil 如果 EOF 已经 到达。

例子:

print("\nEnter your name:\n")
if let name = readLine() {
    print("\nHello \(name)!\n")
}

ed@swiftux:~/Swift/Scripts$ ./testReadline

输入你的名字:

埃里克

你好埃里克!

readline() 也适用于|(管道):

ed@swiftux:~/Swift/Scripts$ echo "Mike" | ./testReadline

输入你的名字:

你好迈克!


我也尝试过NSFileHandle 的经典方式,但还没有实现:

致命错误:availableData 尚未实现:文件 Foundation/NSObjCRuntime.swift

【讨论】:

  • NSFileHandle 是 Foundation 框架的一部分。请记住,Swift 是由 Apple 开源的语言,而不是 iOS 或任何其他构建其专有操作系统的框架
  • @Edwin Foundation 正在 GitHub 上以开源 Swift 实现。这就是为什么我说 NSFileHandle还没有实现,我当然是在谈论 Foundation,而不是其他任何东西,当然也不是 - 你这个傻瓜 - 关于 iOS 或其 SDK。 :p 这是一个 Swift 和 Linux 的答案,除了你,没有人在这里谈论 iOS。
  • 谢谢你对我的教育,我应该把你的回复读到最后,我现在肯定还不是一个傻瓜
【解决方案2】:

如果您在 Linux 上导入 Glibc,在 macOS 上导入 Darwin.C,那么您可以使用 getline 函数一次读取一行。

这需要一点 c 互操作,但您可以将其包装起来以呈现更 Swifty 的界面。例如,以下函数返回一个生成器,该生成器迭代从文件流中读取的行:

#if os(Linux)
  import Glibc
#else
  import Darwin.C
#endif

func lineGenerator(file:UnsafeMutablePointer<FILE>) -> AnyIterator<String>
{
  return AnyIterator { () -> String? in
    var line:UnsafeMutablePointer<CChar>? = nil
    var linecap:Int = 0
    defer { free(line) }
    let charactersWritten = getline(&line, &linecap, file)

    if charactersWritten > 0 {
      guard let line = line else { return nil }
      return String(validatingUTF8: line)
    }
    else {
      return nil
    }
  }
}

这适用于 Swift 3。您可以找到一个小的 swiftecho example project,它可以从命令行执行此操作。

【讨论】:

    【解决方案3】:

    我找到了一种从stdin 读取字符的方法,但它并不漂亮,但它显示了Glibc 可以做什么。

    import Glibc
    
    var buf = UnsafeMutablePointer<CChar>.alloc(32)
    
    fread(buf, 1, 32, stdin)
    
    // or
    
    fgets(buf, 32, stdin)
    

    并且buf 具有输入字符。

    【讨论】:

      猜你喜欢
      • 2019-09-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2011-10-22
      • 2012-04-25
      相关资源
      最近更新 更多