2016-12-31 35 views
-1

我有初始化結構中的問題,在夫特3.flatMap,結構和JSON在夫特3

從接收的URLRequest JSON數據的協議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 

    } 
} 

然後,我有以下的代碼,我試圖映射字典的數組結構演員。我認爲我將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

在該方法中,你返回'flatMap'結果,它好像你忘詞鍵入註釋在函數簽名的返回類型。現在,你還沒有向我們展示這個函數,但要確保你的函數看起來不像'func myFunction(一些參數){...',而是'func myFunction(一些參數) - > [Actor] {。 ..'。 – dfri

回答

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