【问题标题】:How do I open a file in Swift?如何在 Swift 中打开文件?
【发布时间】:2023-04-08 00:28:01
【问题描述】:

我还没有看到 Swift 标准库的文档,我希望在其中找到类似 File 类或结构的东西,它具有用于打开、读取和写入文件的接口。您对 File IO 的所有期望。有没有,或者将依赖 NSFileManager 及其同类?

【问题讨论】:

  • 已经有NSFileManager API 和 C API,我看不出有什么理由要制作新的 Swift API
  • @BryanChen 我希望惯用的 Swift 开发的接口比 NSFileManager 简洁得多。给我let fh = File.open("path"); while var line = fh.readline() { ... }; fh.close()
  • swift 是一种非常新的语言。如果你等一年,我很确定会有很多好图书馆供你使用
  • @BryanChen 是的,这就是我的希望。只是有点惊讶像 File I/O 这样基本的东西还不存在。但考虑到 Foundation 的存在,观望习语的发展是有意义的。

标签: file io swift


【解决方案1】:

如果你只需要将文件的内容读入字符串,Swift 2.0 的方法是这样的:

do {
    var dictionary = try String(contentsOfFile: "/usr/share/dict/words", encoding: NSUTF8StringEncoding)
} catch {

}

否则,上面提到的更多涉及的方法有效。

【讨论】:

    【解决方案2】:

    Swift 标准库不包含此功能。标准库主要包含数据结构、低级类型和调用、半内置语言特性;超出print()readLine() 的I/O 被视为超出范围。我真的不希望这种情况在不久的将来发生改变。

    但是,Foundation 包含文件 I/O 调用,Swift Corelibs 项目正在努力在纯 Swift 中重新实现 Foundation,以便在 Swift 所在的任何地方都可以使用它。每个主要操作系统上可用的 POSIX I/O 调用在 Swift 中也可用,尽管它们使用起来要笨拙得多。

    【讨论】:

    • 似乎 Foundation 会成为 Swift 的标准(扩展)库,不是吗?
    • @theory 这似乎是长期计划,是的。
    • 那么 NSData,正如@jean-le-moignan 所建议的那样?
    • @theory 是的,我想说各种 init(contentsOfURL:) throwswriteToURL(_:) throws API 是从 Swift 读取和写入文件的最佳简单解决方案。
    【解决方案3】:

    如果文件在您的 iOS 项目中,这是一种方法(希望这是您的情况):

    var filePath = Bundle.main.path(forResource: "theFile", ofType: "txt")
    var data     = Data(contentsOf: URL(fileURLWithPath: filePath))
    

    【讨论】:

    • 是的,我的意思是面向 Swift 的接口,而不是现有的 Foundation 库。
    【解决方案4】:

    您通常会在应用程序中使用 UIDocument 和其他与 iCloud 相关的方式来保存文件,但在 Swift 博客 Apple uses examples based on C and POSIX 中用于打开和保存文件。所以他们举了一个例子:

    let fd = open("/tmp/scratch.txt", O_WRONLY|O_CREAT, 0o666)
    
    if fd < 0 {
        perror("could not open /tmp/scratch.txt")
    } else {
        let text = "Hello World"
        write(fd, text, text.characters.count)
        close(fd)
    }
    

    而且它看起来很像 Swift,但我不知道你是否想在 Cocoa 框架之上使用它。

    【讨论】:

    • 我不认为那是 像 Swift 的。非常像 C。
    【解决方案5】:

    我认为此时唯一有效的答案是:没有基于 Swift 的文件/IO 库,因此您现在只需要使用基于 Objective-C 的 Foundation 类。正如@BryanChen 所说,也许一年后回来找一个更充实的 Swift 标准库。

    【讨论】:

      猜你喜欢
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 2014-10-17
      • 1970-01-01
      • 2014-07-04
      • 2022-01-04
      • 2019-06-02
      相关资源
      最近更新 更多