2017-01-02 1 views
-2

Je rencontre un problème avec le code suivant. Je télécharge une liste d'acteurs dans JSON et je veux peupler Struct Actor avec les données reçues. Tout fonctionne bien jusqu'à ce que j'essaie de flatmap sur les données reçues et essaye d'initialiser la structure de l'acteur. Lorsque j'essaie de compiler le code, j'obtiens l'erreur: Impossible d'affecter la valeur de type '()' à type [Acteur]. L'erreur correspond à une ligne dans viewDidLoad actorsList = downloadActors() Quelqu'un aurait-il une recommandation pour résoudre ce problème?Struct Init avec JSON et flatMap

import UIKit 

func downloadActors() { 


var request = URLRequest(url: URL(string: "url...")!) 

request.httpMethod = "POST" 
let postString = "actorGroup=\("Superhero")" 
request.httpBody = postString.data(using: .utf8) 


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

DispatchQueue.main.async { 

     guard let data = data, error == nil else { 
      print("error=\(error)") 
      return 
     } 


if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { 
      print("error : statusCode should be 200 but is \(httpStatus.statusCode)") 
      print("response = \(response)") 
     } 

     if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode == 200 { 

      do { 
       let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: AnyObject] 

      guard let actorsJSON = json?["response"] as? [[String : AnyObject]] else { 
        return 
       } 


      } catch { 
       print("catch error") 
      } 


     } 
} 

    } 

    task.resume() 

} 

func loadActors() -> [Actor] { 
         if let actors = actorsJSON as? [[String : AnyObject]] { 
          return actors.flatMap(Actor.init) 

         } 
        } 
        let actorsArray = loadActors() 



class MasterViewController: UITableViewController { 

    var actorsList = [Actor]() 

    var detailViewController: DetailViewController? = nil 
    var objects = [Any]() 


    override func viewDidLoad() { 

     super.viewDidLoad() 

     actorsList = downloadActors() 


     print(actorsList) 

Struct acteurs se présente comme suit:

struct Job { 

    let actorGroup: String 
    let actorName: String 

} 

    extension Actor: JSONDecodable { 
     init?(JSON: [String : AnyObject]) { 
      guard let actorGroup = JSON["actorGroup"] as? String, let actorName = JSON["actorName"] as? String else { 
       return nil 
      } 
      self. actorGroup = actorGroup 
      self. actorName = actorName 

     } 
    } 
+1

Code très confus. Que fait la fonction au milieu du bloc 'do'? Pourquoi tapez-vous 'actorsJSON' deux fois? La propriété calculée est 'let listActors ...' qui devrait être une liaison optionnelle ('if let ...'). En outre '.mutableContainers' est complètement absurde dans Swift. Et enfin un dictionnaire JSON est '[String: Any]' dans Swift 3. – vadian

+0

Où le 'func loadActors' devrait être localisé? Si je le place hors du bloc 'do', j'obtiens une erreur 'identificateur non résolu' – Luke

+0

En fait, vous n'avez pas du tout besoin du wrapper de fonction. – vadian

Répondre

0
let listActors = actorsJSON as? [[String : AnyObject]] { 

devrait être:

if let listActors = actorsJSON as? [[String : AnyObject]] { 

Edit: Pour plus d'informations Je voudrais ajouter Vadian's commentaire:

Code très confus. Que fait la fonction au milieu du bloquer? Pourquoi tapez-vous actorsJSON deux fois? La propriété calculée est let listActors ... ce qui devrait être probablement une liaison optionnelle (si let ...). Plus loin .mutableContainers est complètement absurde dans Swift. Et enfin un dictionnaire JSON est [String:Any] dans Swift 3.