ios 使用Swift调用Flickr API

xtfmy6hx  于 5个月前  发布在  iOS
关注(0)|答案(1)|浏览(81)

我试图从Flickr API中获取一些JSON数据,但我的Swift代码不起作用。
这是基于Jameson Quave's tutorial使用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()
}

字符串
这显示了requestURLargument 的错误:
“类型NSURL的值?未展开”。
当我添加“!"时,错误消失了。但是,我仍然在调用时得到一个运行时错误。
在调试器中,我看到:

data =(NSData!)16642字节

致命错误:打开可选值时意外发现nil
我错过了什么?

编辑- * 这在Xcode 6上工作正常,在将Xcode更新到6.1版本时坏了 *

o75abkj4

o75abkj41#

结果变量实际上是NSDictionary?类型的,如果它是nil并且你试图访问它,将会引发一个运行时错误。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,而是使用新的错误处理并标记为throwing。签名现在看起来像这样:

public class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject


要实现同样的功能,现在必须将调用 Package 在do/catch块中,或者使用try?代替try:

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

相关问题