使用Swift调用Flickr API

nv.*_*now 5 iphone api flickr ios swift

我试图从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()
}
Run Code Online (Sandbox Code Playgroud)

这显示了requestURL 参数的错误:"NSURL类型的Vaue?未解包".当我添加"!"时,错误消失了.但是,在拨打电话时我仍然会收到运行时错误.

在调试器中,我看到:

data =(NSData!)16642个字节
致命错误:在展开Optional值时意外发现nil

我错过了什么?

编辑 - 这在Xcode 6上运行良好,它在将Xcode更新到6.1版时破坏了

Dae*_*ehn 6

结果变量实际上是NSDictionary类型的?如果它是nil并且您尝试访问它,则会引发运行时错误.JSONObjectWithData函数返回一个可选项,您可以在其声明中看到:

class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions, error: NSErrorPointer) -> AnyObject?
Run Code Online (Sandbox Code Playgroud)

你必须将结果转换为NSDictionary类型的对象?而不是NSDictionary,以使其工作

let result = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as NSDictionary?
if let unwrappedResult = result {
    println(unwrappedResult)
}
Run Code Online (Sandbox Code Playgroud)

SWIFT 2更新:

JSONObjectWithData不再返回Optional,而是使用新的错误处理并标记为throw.签名现在看起来像这样:

public class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject
Run Code Online (Sandbox Code Playgroud)

要实现相同的功能,现在必须将调用包装在do/catch块中,或者使用try?而不是尝试:

do {
    let result = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary
    print(result)
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)

  • 您必须以您希望响应的格式告诉API.这可以通过发送值为"json"的"format"参数来完成.我有一些问题,因为即使这样,API也会用JSONP响应,但我在这里找到了一个解决方案[http://stackoverflow.com/questions/15930932/how-do-i-parse-this-flickr-response](http:/) /stackoverflow.com/questions/15930932/how-do-i-parse-this-flickr-response). (2认同)