我花了一整天的时间试图从 swift 中的 NSURLTagNamesKey 的 NSURL.getResourceValue 获取可用的结果。该函数应将路径名作为字符串,并返回用户标签的字符串数组。我有一个可以在 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,带/不带感叹号和问号。
我正处于放弃 Swift 的边缘。
最佳答案
你会踢自己的......
方法 getResourceValue:forKey:error
返回一个值 - Bool
,指示您作为第一个参数传入的容器是否已填充。不幸的是,您正在将此 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]
}
关于cocoa - 在 Swift 中转换 NSURL.getResourceValue 返回的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28254410/