URLResourceValue和setResourceValues Swift 3

10

我正在尝试弄清楚如何使用 Swift 3 修改下面的代码。

let paths = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true) as NSArray

for path in paths {
    let dir = path as! String
    print("the paths are \(path)")
    let urlToExclude = NSURL.fileURL(withPath: dir)
    do {

        try urlToExclude.setResourceValue(NSNumber(value: true), forKey: URLResourceKey.isExcludedFromBackupKey)

    } catch { print("failed to set resource value") }
}

我遇到的错误是this

我使用了上述代码来排除从备份到iCloud中的文件,这在之前版本的Swift中运行良好,但升级到Xcode 8后,我就被卡住了。

我会非常感谢任何帮助或建议。


urlToExclude 是一种 URL 类型,你可能想将其转换为 NSURLlet urlToExclude = NSURL.fileURL(withPath: dir) as NSURL - Siavash Alp
@SiavashAlp,那也可以,但是 Xcode 的建议不应该被考虑吗? - Dushyant
2个回答

30

Xcode建议您使用"struct URLResourceValues"和"URL.setResourceValues(_:)"来取代原有代码,例如:

let paths = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)

for dir in paths {
    print("the paths are \(dir)")
    var urlToExclude = URL(fileURLWithPath: dir)
    do {

        var resourceValues = URLResourceValues()
        resourceValues.isExcludedFromBackup = true
        try urlToExclude.setResourceValues(resourceValues)

    } catch { print("failed to set resource value") }
}
请尝试。 注意 请注意,文件的URL必须是一个var - 如果它是一个let,你会得到奇怪的错误消息(参见评论)。

还有一件事我需要补充:var urlToExclude = URL(fileURLWithPath: dir as! String)。 - Dushyant
是的,我是。谢谢! - Dushyant
7
在发布的 Xcode 8 中,这对我不起作用。文档说应该使用 [URLResourceKey : Any],但它需要一个 [URLResourceKey : AnyObject]。Xcode 生成的接口文件显示它需要一个 URLResourceValues,但编译器不需要它。 - Rick
4
我和你一模一样遇到了这个问题,@Rick。 Xcode 8 和 Swift 3 真的让人头痛。 - shawnwall
12
我找到了问题所在。我设置值的URL是一个“let”,而不是一个“var”,所以Swift编译器给了我一系列非常令人困惑的错误消息(取决于我尝试了什么)。 - Rick
显示剩余3条评论

11
另外,除了TheEye提供的建议之外,还要确保您的URL是使用var声明而不是let。

这是在迁移到Swift 3后使我的代码工作的原因。


好的,因为这个问题我浪费了2个小时。现在它可以工作了,在将其设置为变量后...你能解释一下为什么需要这样吗? - Francois Nadeau
啊,我找到了自己的答案...由于Swift 3中URL是一个结构体,因此您无法在从getter返回的不可变值上调用变异方法。要修改URL,请先将其分配给var。 - Francois Nadeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接