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

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

我正在尝试借助 GET 请求将图像从服务器加载到我的 iOS 应用程序中。但是,它报告错误:

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

谁能帮忙解决这个错误?

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()

    }

}

试试这个:

替换为您的代码

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")
    }
}

尝试从 NSURLSession 任务的 data 参数解码 JSON 时会发生这种情况。

data 是一个 Data? 选项。先解包,以免报错。

nsURLSession.dataTask(with: url) { (data, response, error) in

    // unwrap `data: Data?` first

    guard let dictionary = try? JSONSerialization.jsonObject(with: data, options: []) as? [String : Any] else {
        return
    }
}.resume()

NSData returns optional 这就是为什么您需要使用条件可选绑定技术将其解包然后它才能工作的原因。

    let content = NSData()

    if let data = content {
        do {
            let json =  try JSONSerialization.jsonObject(with: data as Data, options: []) as! NSDictionary
        } catch let error {
            print(error)
        }
    }