我试图从 Flickr API 获取一些 JSON 数据,但我的 Swift 代码无法正常工作。
这是基于 Jameson Quave 的关于使用 Swift 发出 API 请求的教程
func GetFlickrData(tags: String) {
let baseURL = "https://api.flickr.com/services/rest/?&method=flickr.photos.search"
let apiString = "&api_key=\(apiKey)"
let searchString = "&tags=\(tags)"
let requestURL = NSURL(string: baseURL + apiString + searchString)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(requestURL, completionHandler: { data, response, error -> Void in
var result = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as NSDictionary
dispatch_async(dispatch_get_main_queue(), {
println(result)
})
})
task.resume()
}
这向我显示了 requestURL
argument 的错误:
“NSURL 类型的值?未解包”。当我添加“!”时,错误就消失了。但是,我在拨打电话时仍然遇到运行时错误。
在调试器中,我看到:
数据 = (NSData!)16642 字节
致命错误:在解包可选值时意外发现 nil我错过了什么?
编辑 - 这在 Xcode 6 上工作正常,当将 Xcode 更新到版本 6.1 时它就崩溃了
class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions, error: NSErrorPointer) -> AnyObject?
您必须将结果转换为 NSDictionary 类型的对象吗?而不是 NSDictionary 才能使其正常工作
let result = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as NSDictionary?
if let unwrappedResult = result {
println(unwrappedResult)
}
Swift 2 更新:
JSONObjectWithData 不再返回Optional,而是使用新的错误处理并被标记为抛出。签名现在看起来像这样:
public class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject
要实现相同的目标,现在必须将调用包装在 do/catch 块中,或者使用 try?而不是尝试:
do {
let result = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary
print(result)
} catch {
print(error)
}