在 Swift 2.0 中使用基本文件系统功能时遇到问题

Trouble working with basic file system functionality in Swift 2.0

尝试使用 Xcode 7.1 在 iOS 9.1 上的 Swift 2.0 中创建一个简单的示例代码块。在 techotopia 中试过这篇文章;我怀疑这是基于 swift 1.2.

进行了一些微小的更改,以便它可以编译 & 运行,但尽管它似乎有效,但它似乎没有将我的字符串保存到文件中。我在这里错过了一些功能或一些微妙的东西。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textBox: UITextField!

    var fileMgr: NSFileManager = NSFileManager.defaultManager()
    var docsDir: String?
    var dataFile: String?
    var string: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        let dirPaths = NSSearchPathForDirectoriesInDomains(
            .DocumentDirectory, .UserDomainMask, true)

        docsDir = dirPaths[0] as String
        let dataFile = NSURL(fileURLWithPath: docsDir!).URLByAppendingPathComponent("datafile.dat")

        string = "\(dataFile)"
        print(string)
        if fileMgr.fileExistsAtPath(string) {
            let databuffer = fileMgr.contentsAtPath(string)
            let datastring = NSString(data: databuffer!,
                encoding: NSUTF8StringEncoding)
            textBox.text = datastring as? String
        }
    }

    @IBAction func saveText(sender: AnyObject) {
        let databuffer = (textBox.text)
        let data = databuffer?.dataUsingEncoding(NSUTF8StringEncoding)

        fileMgr.createFileAtPath(string, contents: data,
            attributes: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

更多测试;注意到我在尝试创建文件时收到此错误... __connection_block_invoke_2 中的错误:连接中断;这解释了为什么它不起作用,如果我能锻炼它在说什么就好了?

继续尝试调试;添加了 UIFileSharingEnabled 但看不到 Documents 目录;添加更多代码来测试它的存在,如果丢失则创建它;没有告诉我它已经存在了……即使它显然是看不见的……

当您这样做时,string 最终成为文件 URL 的字符串表示形式,例如file://...file:// 前缀是 URL "scheme"(如 http://ftp://)。但在字符串开头包含方案意味着这不是有效路径。您必须删除该方案。

最简单的方法是使用 path 方法从没有该方案的 NSURL 获取路径。现在,我还会使用 URLForDirectory 来获取文档文件夹的 URL。

class ViewController: UIViewController {

    @IBOutlet weak var textBox: UITextField!

    lazy var fileMgr = NSFileManager.defaultManager()
    var path: String!

    override func viewDidLoad() {
        super.viewDidLoad()

        let documents = try! fileMgr.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
        path = documents.URLByAppendingPathComponent("datafile.dat").path

        if fileMgr.fileExistsAtPath(path) {
            if let data = fileMgr.contentsAtPath(path) {
                textBox.text = String(data: data, encoding: NSUTF8StringEncoding)
            }
        }
    }

    @IBAction func saveText(sender: AnyObject) {
        let data = textBox.text?.dataUsingEncoding(NSUTF8StringEncoding)

        fileMgr.createFileAtPath(path, contents: data, attributes: nil)
    }

}

或者我可能完全留在 URL 的世界中,完全退出路径,还使用抛出有意义的错误消息的方法:

class ViewController: UIViewController {

    @IBOutlet weak var textBox: UITextField!

    lazy var fileMgr = NSFileManager.defaultManager()
    var fileURL: NSURL!

    override func viewDidLoad() {
        super.viewDidLoad()

        do {
            let documents = try fileMgr.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
            fileURL = documents.URLByAppendingPathComponent("datafile.dat")

            var reachableError: NSError?
            if fileURL.checkResourceIsReachableAndReturnError(&reachableError) {
                textBox.text = try String(contentsOfURL: fileURL)
            }
        } catch {
            print(error)
        }
    }

    @IBAction func saveText(sender: AnyObject) {
        do {
            try textBox.text?.writeToURL(fileURL, atomically: true, encoding: NSUTF8StringEncoding)
        } catch {
            print(error)
        }
    }

}