在swift中使用NSURL getResourceValue

CMo*_*ont 15 url swift

无法确定如何在swift中进行以下调用:

var anyError: NSError? = nil
var rsrc: NSNumber? = nil
var success = url.getResourceValue(&rsrc, forKey:NSURLIsUbiquitousItemKey, error:&anyError)
Run Code Online (Sandbox Code Playgroud)

以上不编译:

Cannot convert the expression's type 'Bool' to type 'inout Bool'
Run Code Online (Sandbox Code Playgroud)

所以我尝试了这个:

var anyError: NSError? = nil
var rsrc: AutoreleasingUnsafePointer<AnyObject?> = nil
var success = url.getResourceValue(rsrc, forKey:NSURLIsUbiquitousItemKey, error:&anyError)
Run Code Online (Sandbox Code Playgroud)

但这会产生EXC_BAD_ACCESS运行时错误.

如何将预期的第一个arg传递给AutoreleasingUnsafePointer<AnyObject?>(根据doc指向一个布尔NSNumber),然后能够检查其预期的Bool值?

dre*_*wag 29

您需要创建rsrc一个可选的AnyObject并通过引用传递它,如下所示:

var anyError: NSError?
var rsrc: AnyObject?
var success = url.getResourceValue(&rsrc, forKey:NSURLIsUbiquitousItemKey, error:&anyError)
Run Code Online (Sandbox Code Playgroud)

注意:您不需要将Optionals初始化为nil,默认情况下它们设置为nil.

如果您想检查该值是否为NSNumber,则可以进行转换:

if let number = rsrc as? NSNumber {
    // use number
}
Run Code Online (Sandbox Code Playgroud)


Eli*_*rke 7

这是针对Swift 2.0更新的drewag代码

    do {
        var rsrc: AnyObject?
        try element.getResourceValue(&rsrc, forKey: NSURLIsDirectoryKey)
        if let number = rsrc as? NSNumber {
            if number == true {
                // do something
            }
        }
    } catch {
    }
Run Code Online (Sandbox Code Playgroud)


ing*_*nti 5

在swift 3之前的调用不可用/弃用:

所以使用:

var keys = Set<URLResourceKey>()
keys.insert(URLResourceKey.isDirectoryKey)
do{
    let URLResourceValues = try fileURL.resourceValues(forKeys: keys)
    }catch _{

   }
Run Code Online (Sandbox Code Playgroud)