【发布时间】: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