2017-04-06 76 views
2

我正在使用AlamofireSwiftyJSON。我想爲常見情況構建一般請求和解析模型。首先,我制定了一個名爲JSONConvertible的協議。使用協議的動態初始化器

protocol JSONConvertible { 
    init?(json: JSON) 
} 

其次,我在Alamofire擴展Request類。

extension Request { 

    func getResult(format: [String: AnyClass]) { 
     self.responseJSON { (response) in 
      guard let statusCode = response.response?.statusCode else { 
       return 
      } 
      switch statusCode { 
      case 200: 
       var result = [String: AnyObject]() 
       let json = JSON(rawValue: response.result.value!)! 
       for (key, className) in format { 
        if className.self is JSONConvertible { 
         let value = className.self(json: json[key]) // get error in this line 
        } 
       } 
      case 201..<400: 
       break 
      case 400...Int.max: 
       break 
      default: 
       break 
      } 

     } 
    } 
} 

但我從編譯器得到一個錯誤。因爲AnyObject只是協議,並沒有這個初始化器。我不想只獲取字典或數組。我想獲得具體課程的實例。請幫幫我。非常感謝!

回答

1

這是因爲在if裏面className.self的類型仍然是AnyObject。您需要將其轉換爲JSONConvertible,然後才能使用初始值設定項。

if let concreteClass = className.self as? JSONConvertible.Type 
{ 
    let value = concreteClass.init(json: json[key]) 
} 

如果您熟悉科特林,迅速不做在if條款進行型式試驗時自動澆注。

+0

至少沒有錯誤了。謝謝!我會測試它是否會起作用。 – Lumialxk

+0

請注意,您不需要'.self' - 'className as? JSONConvertible.Type'會做。 – Hamish

0

我找到了解決這個問題的另一種方法。定義一個新的協議。

protocol JSONConvertibleObject: AnyObject, JSONConvertible { 

} 

並用此代替。

extension Request { 

    func getResult(format: [String: JSONConvertibleObject]) { 
     self.responseJSON { (response) in 
      guard let statusCode = response.response?.statusCode else { 
       return 
      } 
      switch statusCode { 
      case 200: 
       var result = [String: AnyObject]() 
       let json = JSON(rawValue: response.result.value!)! 
       for (key, className) in format { 
        let value = className.self.dynamicType.init(json: json[key]) 
       } 
      case 201..<400: 
       break 
      case 400...Int.max: 
       break 
      default: 
       break 
      } 

     } 
    } 
}