3 回答
TA贡献1802条经验 获得超4个赞
显然,编译器认为NSSearchPathDirectory:0是一个数组,并且当然希望使用该类型NSSearchPathDirectory。当然不是有用的错误消息。
但至于原因:
首先,您混淆了参数名称和类型。看一下函数定义:
func NSSearchPathForDirectoriesInDomains(
directory: NSSearchPathDirectory,
domainMask: NSSearchPathDomainMask,
expandTilde: Bool) -> AnyObject[]!
directory并且domainMask是名称,您正在使用类型,但是无论如何您都应该将它们留给函数使用。它们主要用于方法中。
另外,Swift是强类型的,因此您不应仅使用0。而应使用枚举的值。
最后,它返回一个数组,而不仅仅是一个路径。
因此,我们有了(针对Swift 2.0更新):
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
对于Swift 3:
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
TA贡献1797条经验 获得超6个赞
现代建议是将NSURL用于文件和目录,而不是基于NSString的路径:
因此,以NSURL的形式获取应用程序的Document目录:
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,如果捆绑包中不存在初始版本,则将其从副本包中复制出来;如果发生错误,则将其复制为nil。
- 3 回答
- 0 关注
- 807 浏览
添加回答
举报