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)
}
}
我正在尝试借助 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)
}
}