我一直在互联网上寻找这个问题的答案,而且我所得到的每一个答案都不起作用,非常复杂,仅针对iOS,或者是一个组合三个。我只是在寻找一种在Swift中执行文件I / O以便在Mac上使用的简单方法。所以我想混合使用c ++和swift的方法也可行,但为此,我遇到了和以前一样的问题。任何帮助将不胜感激!
答案 0 :(得分:12)
有很多选择,它取决于您尝试编写的内容以及数据的大小/等(数百兆字节的数据需要不同的技术)。
但最简单的方法是:
import Cocoa
var str = "Hello, playground"
// get URL to the the documents directory in the sandbox
let documentsUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
// add a filename
let fileUrl = documentsUrl.URLByAppendingPathComponent("foo.txt")
// write to it
str.writeToURL(fileUrl, atomically: true, encoding: NSUTF8StringEncoding, error: nil)
可能会让你感到困惑的一件事是OS X有严格的沙盒来防止你可以写入磁盘的哪些部分。作为一种安全措施,用户将随机代码粘贴到Xcode中并防止错误删除某人的整个硬盘...... Playground强制执行沙盒,尽管许多mac应用程序不使用沙盒(它通常仅启用沙盒)应用程序部署在Apple的商店中。
您的应用在磁盘上有一个可以写入的沙箱,这就是NSFileManager()返回上面的URL。
要将沙箱中的孔打到磁盘的其余部分,您需要让用户参与进来。例如,如果他们将文件拖到您的应用程序图标上,您可以写入它。如果他们在打开或保存面板中选择文件,那么您可以写入该文件。如果用户选择目录,甚至是文件系统的根目录,则可以写入选择的所有后代。
虽然我从未研究过如何运作,但也可以在应用启动时持续访问文件/目录。如果您将它用于基于文档的应用程序,NSDocumentController会为您完成。
答案 1 :(得分:11)
Abhi Beckert's代码更新为Swift 3:
import Cocoa
var str = "Hello, playground"
// get URL to the the documents directory in the sandbox
let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
// add a filename
let fileUrl = documentsUrl.appendingPathComponent("foo.txt")
// write to it
try! str.write(to: fileUrl!, atomically: true, encoding: String.Encoding.utf8)