转换 NSURL.getResourceValue 在 Swift 中返回的数组

casting arrays returned by NSURL.getResourceValue in Swift

我花了一整天的时间试图从 NSURL.getResourceValue 中为 swift 中的 NSURLTagNamesKey 获取可用的结果。该函数应将路径名作为字符串,并将 return 字符串数组用于用户标签。我有一个适用于 Objective C 的版本,但无法在 Swift.

中重写

这是代码的当前版本:

    func listTags(filePath:String)->[String]{
    //convert path string to NSURL
    let theURL : NSURL = NSURL.fileURLWithPath(filePath)!

    //get tags for NSURL -- should be NSArray of NSStrings hiding in an AnyObject?
    var tags : AnyObject?
    var anyError: NSError?
    tags = theURL.getResourceValue(&tags, forKey:NSURLTagNamesKey, error: &anyError)

    //unwrap tags object? This part never works
    let tagArray = tags! as [AnyObject]

    //insert every item in tag array into results array as a String
    var results = [String]()
    for object in tagArray{
        results.append(object as String)
    }

    return results
}

代码可以编译,但在尝试将 AnyObject 转换为任何其他类型时会中断。我已经尝试了所有我能想到的组合——[AnyObject]、[String]、NSArray、with/without感叹号和问号。

我即将放弃 Swift。

你会踢自己的...

方法getResourceValue:forKey:error returns一个值-一个Bool,表示你作为第一个参数传入的容器是否已经填充。不幸的是,您将此布尔值分配给 tags - 您的容器! - 这意味着 Cocoa 传递给此容器的任何内容都会立即被覆盖。这对我有用...

var tags : AnyObject?
var anyError: NSError?
var success = theURL.getResourceValue(&tags, 
                       forKey:NSURLTagNamesKey, 
                       error: &anyError)
if success {
    println("container contents \(tags as [String])") // -> [AutoLayout, Swift]
}

With Swift 2,getResourceValue(:forKey:) returns () throws,即抛出错误的void类型,所以上面的答案将不再有效。它需要包含在没有 anyError 变量的 do {try} catch{} 结构中:

do {
    try theURL.getResourceValue(&tags, forKey: NSURLTagNamesKey)
    return tags as! [String]
} catch {
    // process the error here
}