Ошибка синтаксического анализа Json: использование необъявленного типа 'Foundation' в Swift iOS - PullRequest
0 голосов
/ 06 октября 2018

Я создаю приложение, используя Swift, где мне нужно отобразить список стран, используя следующий URL:

https://restcountries.eu/rest/v2/all

Здесь я должен получитьтолько ключ name и добавь в мой NSMutableArray.Когда я пытаюсь разобрать это с помощью URLSession, я получаю сообщение об ошибке:

expression produced error: error: /var/folders/_3/27lhgzw9699c4_yg37r72_d80000gp/T/expr40-bcf47d..swift:1:65: error: use of undeclared type 'Foundation'
Swift._DebuggerSupport.stringForPrintObject(Swift.UnsafePointer<Foundation.Data>(bitPattern: 0x105c0c2f0)!.pointee)

Ниже приведен мой код:

func fetchCountryList(countryURL:URL, completion:@escaping (NSDictionary) -> ()) {

            print(countryURL)

            let request = NSMutableURLRequest( url: countryURL as URL)

            let task = URLSession.shared.dataTask(with: request as URLRequest) {
                data, response, error in
                do{
                    if let data = data,
                        let jsonString =  try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
                        , error == nil {
                        completion(jsonString)
                    } else {
                        print("error=\(error!.localizedDescription)")
                        let errorDict = ["error_status":true,"message":error!.localizedDescription] as [String : Any]
                        completion(errorDict as NSDictionary)

                    }
                }
                catch{
                    print("error=\(error.localizedDescription)")
                    let errorDict = ["error_status":true,"message":error.localizedDescription] as [String : Any]
                    completion(errorDict as NSDictionary)

                }

            }
            task.resume()
    }

Может кто-нибудь предложить мне мою ошибку здесь.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Заменить

try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary

на

try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [[String: Any]]

Поскольку это массив объектов, нам также необходимо привести json как array

.array of country names, мы можем сделать это:

guard let countries = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [[String: Any]] else {
    return
}
let countryNames = countries.map { $0["name"] as! String }
0 голосов
/ 06 октября 2018

Заменить

 let jsonString =  try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary

на

if let result =  try JSONSerialization.jsonObject(with: data, options:[]) as? [[String:Any]] {
   for item in result {
     print(item["name"])
   }  
 }

ответом является массив, а не словарь, также не используйте NS stuff

NSDictionary => [String: Любой]

NSUrl => URL

NSMutableURLRequest => URLRequest


func fetchCountryList(countryURL:URL, completion:@escaping (_ arr :[[String:Any]]?, _ error:Error?) -> ()) {

            print(countryURL)

            let request = URLRequest( url: countryURL)

            let task = URLSession.shared.dataTask(with: request) {
                data, response, error in
                do{
                    if let data = data,
                        let jsonString =  try JSONSerialization.jsonObject(with: data, options:[]) as? [[String:Any]]
                        , error == nil {
                        completion(jsonString,nil)
                    } else {
                        print("error=\(error!.localizedDescription)")
                        let errorDict = ["error_status":true,"message":error!.localizedDescription] as [String : Any]
                        completion(nil,error)

                    }
                }
                catch{
                    print("error=\(error.localizedDescription)")
                    let errorDict = ["error_status":true,"message":error.localizedDescription] as [String : Any]
                    completion(nil,error)

                }

            }
            task.resume()
    }

Вызов

serviceModel.fetchCountryList(countryURL:countryURL){ (result,error) in 
  if let res = result {
    print(res)
  } 
}           
...