Swift 3中的flatMap,Struct和JSON

时间:2016-12-31 23:21:19

标签: ios swift struct flatmap

我在使用从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 '()')

非常感谢任何帮助!

1 个答案:

答案 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! })
    }
}