我一直在使用未解析的标识符错误swift

时间:2016-07-22 00:57:33

标签: ios swift debugging error-handling

当我尝试运行此项目时,我遇到了“使用未解析的标识符错误”。这是我在

行上得到错误的代码
var jsonDict =  try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
 as! NSDictionary
let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in

            if((error) != nil) {
                print(error!.localizedDescription)
            } else {

                let err: NSError?
                do {
                var jsonDict =  try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
                } catch {
                if(err != nil) {
                    print("JSON Error \(err!.localizedDescription)")
                }

                else {
                    //5: Extract the Quotes and Values and send them inside a NSNotification
                    let quotes:NSArray = ((jsonDict.objectForKey("query") as! NSDictionary).objectForKey("results") as! NSDictionary).objectForKey("quote") as! NSArray
                    dispatch_async(dispatch_get_main_queue(), {
                        NSNotificationCenter.defaultCenter().postNotificationName(kNotificationStocksUpdated, object: nil, userInfo: [kNotificationStocksUpdated:quotes])

                    })
                    }
                }

            }
        })

有人可以帮忙吗?谢谢。

3 个答案:

答案 0 :(得分:0)

问题可能是catch块中的这行代码。

let quotes:NSArray = ((jsonDict.objectForKey("query") as! NSDictionary).objectForKey("results") as! NSDictionary).objectForKey("quote") as! NSArray

在上面的陈述jsonDict超出了范围。您在do块中声明了jsonDict,但正在尝试在catch块中使用它。

答案 1 :(得分:0)

这个代码的蜘蛛网正是SwiftyJSON库存在的原因。我推荐它很高,它可以使用cocoapods导入到你的项目中。

使用此库,结果代码为

jsonQuery["query"]["results"]["quote"]

更具可读性,并且当您实现更多API时,速度更快。

答案 2 :(得分:0)

试试以下: - (假设JSON具有根节点结构)

let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: yourURL)
        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithRequest(urlRequest) {
            (data, response, error) -> Void in

            let httpResponse = response as! NSHTTPURLResponse
            let statusCode = httpResponse.statusCode

            if (statusCode == 200) {

                do{

                    let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)



                    if let queries = json["query"] as? [[String: AnyObject]] {
                            for query in queries {
                                if let quote = query["quote"] as? String {
                                        self.quoteArr.append(quote)
                                }

                            }//for loop
                            dispatch_async(dispatch_get_main_queue(),{
                               // your main queue code 
NSNotificationCenter.defaultCenter().postNotificationName(kNotificationStocksUpdated, object: nil, userInfo: [kNotificationStocksUpdated:quotes])
                            })//dispatch

                    }// if loop

                }
                catch
                {
                    print("Error with Json: \(error)")

                }

            }
            else
            {
                // No internet connection
                // Alert view controller
                // Alert action style default


            }