次のコードに問題があります。 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
}
}
非常に混乱しやすいコードです。 'do'ブロックの途中で何が機能していますか?なぜあなたは 'actorsJSON'を2回タイプチェックしますか?計算されたプロパティは 'let listActors ...'であり、おそらくオプションのバインディング( 'if let ...')でなければなりません。さらに、 '.mutableContainers'はSwiftでは完全にナンセンスです。最後にJSON辞書はSwift 3の '[String:Any]'です。 – vadian
'func loadActors'はどこに置かれますか? 'do'ブロックの外に置いた場合は、 'unresolved identifier'というエラーが出ます。 – Luke
実際には、関数ラッパーはまったく必要ありません。 – vadian