Swift 错误:对成员 'jsonObject(with:options:) 的不明确引用



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

对成员 '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 返回可选,这就是为什么您需要使用条件可选绑定技术将其解包,然后它将起作用。

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

最新更新