【问题标题】:Struct Init with JSON and flatMap使用 JSON 和 flatMap 构造 Init
【发布时间】:2017-01-02 16:56:37
【问题描述】:

以下代码有问题。我正在下载 JSON 中的演员列表,我想用接收到的数据填充 Struct Actor。一切都很好,直到我尝试对接收到的数据进行平面映射并尝试初始化 struct Actor。当我尝试编译代码时出现错误:无法将类型“()”的值分配给类型 [Actor]。该错误对应于 viewDidLoadactorsList = downloadActors() 中的一行 有人有什么建议可以解决这个问题吗?

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)

结构Actor如下:

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 两次?计算的属性是let listActors...,它可能是一个可选绑定(if let ...)。此外,.mutableContainers 在 Swift 中完全是一派胡言。最后一个 JSON 字典是 Swift 3 中的[String:Any]
  • func loadActors 应该在哪里?如果我把它放在do 块之外,那么我会收到一个错误“未解析的标识符”
  • 其实你根本不需要函数包装器。
  • 您能否解决问题,正如 vadian 所说,您的代码中有很多问题/不完善。

标签: json initialization swift3 flatmap


【解决方案1】:
let listActors = actorsJSON as? [[String : AnyObject]] {

应该是:

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

编辑:更多信息我想添加Vadian's评论:

非常混乱的代码。 do block中间的功能是什么?你为什么要输入检查actorsJSON 两次?计算的属性是 let listActors... 这应该是一个 optional binding (如果 let ... )。此外,.mutableContainers 在 Swift 中完全是无稽之谈。最后一个 JSON 字典是 Swift 3 中的[String:Any]

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 2010-09-13
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多