使用 Swift 调用 Flickr API

问题描述 投票:0回答:1

我试图从 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 时它就崩溃了

ios swift xcode flickr
1个回答
6
投票
结果变量实际上是NSDictionary类型?如果它为零并且您尝试访问它,则会引发运行时错误。 JSONObjectWithData 函数返回一个可选值,正如您在其声明中看到的那样:

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) }
    
© www.soinside.com 2019 - 2024. All rights reserved.