转换 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
}
我花了一整天的时间试图从 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
}