我在使用从Swift 3中的URLRequest接收的JSON数据初始化Struct时遇到问题。
协议JSONDecodable:
protocol JSONDecodable {
init?(JSON: [String : AnyObject])
}
结构如下,它实现符合JSONDecodable的扩展:
struct Actor {
let ActorID: String
let ActorName: String
}
extension Actor: JSONDecodable {
init?(JSON: [String : AnyObject]) {
guard let ActorID = JSON["ActorID"] as? String, let ActorName = JSON["ActorName"] as? String else {
return nil
}
self.ActorID = ActorID
self.ActorName = ActorName
}
}
然后我有以下代码,我尝试将一个字典数组映射到struct Actor。我认为我将Swift 2和Swift 3语法混合在一起。
guard let actorsJSON = json?["response"] as? [[String : AnyObject]] else {
return
}
return actorsJSON.flatMap { actorDict in
return Actor(JSON: actorDict)
}
但是,我收到以下错误:'flatMap' produces '[SegmentOfResult.Iterator.Element]', not the expected contextual result type 'Void' (aka '()')
非常感谢任何帮助!
答案 0 :(得分:0)
正如@dfri所提到的,你没有向我们展示你的函数签名,但我也猜测你还没有指定函数的返回类型。
这就是我要做的事情
typealias JSONDictionary = [String: AnyObject]
extension Actor {
func all(_ json: JSONDictionary) -> [Actor]? {
guard let actorsJSON = json["response"] as? [JSONDictionary] else { return nil }
return actorsJSON.flatMap(Actor.init).filter({ $0 != nil }).map({ $0! })
}
}