如何在斯威夫特找到NSDocumentDirectory?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我试图用代码获取到Documents文件夹的路径:

var documentsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory:0,NSSearchPathDomainMask:0,true)

但是Xcode会产生错误:不能将表达式的类型‘AnyObject[]!’转换为‘NSSearchPathDirectory’

我在试着理解代码中有什么不对?

提问于
用户回答回答于

显然,编译器认为NSSearchPathDirectory:0是一个数组,当然它希望NSSearchPathDirectory相反。当然不是一条有用的错误信息。

至于原因:

首先,您混淆了参数名称和类型。看看函数定义:

func NSSearchPathForDirectoriesInDomains(
    directory: NSSearchPathDirectory,
    domainMask: NSSearchPathDomainMask,
    expandTilde: Bool) -> AnyObject[]!
  • directorydomainMask是名称,您正在使用类型,但无论如何,您应该将它们排除在函数之外。它们主要用于各种方法。
  • 而且,SWIFT是强类型的,所以您不应该只使用0。使用枚举的值代替。
  • 最后,它返回一个数组,而不仅仅是一个路径。

因此,这就留给我们(SWIFT2.0更新):

let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]

对于SWIFT 3:

let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
用户回答回答于

现在的建议是将NSURL用于文件和目录,而不是使用基于NSString的路径:

因此,要将应用程序的文档目录作为NSURL获得:

func databaseURL() -> NSURL? {

    let fileManager = NSFileManager.defaultManager()

    let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)

    if let documentDirectory: NSURL = urls.first as? NSURL {
        // This is where the database should be in the documents directory
        let finalDatabaseURL = documentDirectory.URLByAppendingPathComponent("items.db")

        if finalDatabaseURL.checkResourceIsReachableAndReturnError(nil) {
            // The file already exists, so just return the URL
            return finalDatabaseURL
        } else {
            // Copy the initial file from the application bundle to the documents directory
            if let bundleURL = NSBundle.mainBundle().URLForResource("items", withExtension: "db") {
                let success = fileManager.copyItemAtURL(bundleURL, toURL: finalDatabaseURL, error: nil)
                if success {
                    return finalDatabaseURL
                } else {
                    println("Couldn't copy file to final location!")
                }
            } else {
                println("Couldn't find initial database in the bundle!")
            }
        }
    } else {
        println("Couldn't get documents directory!")
    }

    return nil
}

这有基本的错误处理,因为这取决于应用程序在这种情况下将做什么。但是这使用文件URL和更现代的API来返回数据库URL,如果初始版本还不存在,就将其复制出来,如果出现错误,则为零。

扫码关注云+社区