2017-01-02 12 views
-2

次のコードに問題があります。 JSONでアクターのリストをダウンロードしています。構造化Actorに受け取ったデータを取り込みたいと思います。受け取ったデータをflatMapして構造体Actorを初期化しようとするまで、すべてがうまく動作します。私はコードをコンパイルしようとすると、私はエラーが発生します:タイプ '()'の値を[アクタ]に割り当てることができません。このエラーは、viewDidLoadの行に対応しています。actorsList = downloadActors()これを解決するための推奨事項はありますか?JSONとflatMapを使用したStruct Init

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

非常に混乱しやすいコードです。 'do'ブロックの途中で何が機能していますか?なぜあなたは 'actorsJSON'を2回タイプチェックしますか?計算されたプロパティは 'let listActors ...'であり、おそらくオプションのバインディング( 'if let ...')でなければなりません。さらに、 '.mutableContainers'はSwiftでは完全にナンセンスです。最後にJSON辞書はSwift 3の '[String:Any]'です。 – vadian

+0

'func loadActors'はどこに置かれますか? 'do'ブロックの外に置いた場合は、 'unresolved identifier'というエラーが出ます。 – Luke

+0

実際には、関数ラッパーはまったく必要ありません。 – vadian

答えて

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

は次のようになります。

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

編集:私はVadian'sコメントを追加したい詳細情報については

非常に混乱しやすいコードです。 の中の機能は、ブロックとは何ですか? actorsJSONを2回入力するのはなぜですか?計算されたプロパティはlet listActors ...おそらくオプションのバインディング(もしあれば)。さらに.mutableContainersはSwiftでは完全にナンセンスです。 JSON辞書はSwift 3の[String:Any]です。

関連する問題