Swift Error: ambiguous reference to member 'jsonObject(with:options:)

himesh picture himesh · Jul 21, 2017 · Viewed 7.5k times · Source

I am trying to load images from server into my iOS app with the help of GET request. However, it reports the error:

ambiguous reference to member 'jsonObject(with:options:)

Can anyone please help resolve the error?

import UIKit

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    @IBOutlet var MyCollectionView: UICollectionView!

    var images : [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        loadImages()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return images.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        //MyCollectionViewCell

        let myCell:MyCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell", for: indexPath) as! MyCollectionViewCell



        DispatchQueue.global(qos: .background).async{

            let imageString = self.images[indexPath.row]
            let imageUrl = NSURL(string: imageString)
            let imageData = NSData(contentsOf: imageUrl! as URL)

            DispatchQueue.main.async {
                //if(imageData! = nil)
                //{

                    myCell.myImageView.image = UIImage(data: imageData! as Data)

                //}//end of if
            }//end of DispatchQueue.main.async




        };//end of main dispatch

        return myCell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("User tapped on image # \(indexPath.row)")
    }

    func loadImages()
    {
            let startTime = NSDate.timeIntervalSinceReferenceDate

            var pageUrl = "Url is here"
        let myUrl = NSURL(string: pageUrl)
        let request = NSMutableURLRequest(url:myUrl! as URL)

        let task = URLSession.shared.dataTask(with: request as URLRequest){
                data, response, error in

            //If error displays any alert message
            if error != nil {

                var myAlert = UIAlertController(title: "Alert", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)

                let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)

                myAlert.addAction(okAction)

                self.present(myAlert, animated: true, completion: nil)

                return


            }

            var err: NSError?

            if let usabledata = data{
            do{
            var jsonArray = try JSONSerialization.jsonObject(with: usabledata, options: .mutableContainers) as! [String:AnyObject]
                print(jsonArray)

            //conditional binding error here
            if let parseJSONArray = jsonArray {

                self.images = parseJSONArray as! [String]

                DispatchQueue.main.async(execute: {
                    self.MyCollectionView.reloadData()

                })//end of dispatchQueue


            }//end of if
            }catch{
                print(error)

            }


        }
        }

        task.resume()

    }

}

Answer

KKRocks picture KKRocks · Jul 21, 2017

Try this :

Replace with your code

if let usableData = data {
    do {
        var jsonArray = try JSONSerialization.jsonObject(with: usableData, options: .mutableContainers)  as! [String:AnyObject] 
        if let parseJSONArray = jsonArray as? [String] {
            // parse array here
        }    
    } catch {
        print("JSON Processing Failed")
    }
}