2017-05-19 2 views
2

J'essaie de créer une fonction générique dans RequestManager qui convertit le JSON reçu du serveur au type spécifié via le ServiceManager. Ceci est mon code:Erreur de types génériques: Impossible de spécialiser un type générique

RequestManager:

typealias ResultResponseManager = (_ data: AnyObject?, _ error: ErrorPortage?) -> Void 
typealias SuccessResponseManager = (_ success: Bool, _ error: ErrorPortage?) -> Void 
typealias objectBlock<T:GenericModel> = (_ object: T?, _ error: ErrorPortage?) -> Void 

extension RequestManager { 

    static func getObject<T: GenericModel>(endpoint: String, completionBlock: objectBlock<T>? = nil){ 

     RequestHelper(url: "\(getAPIURL())\(endpoint))") 
      .performJSONLaunchRequest { (result, error) in 

       if let result = result as? NSDictionary, 
        error == nil { 
        let object = T(dic: result) 
        completionBlock?(object, nil) 
       } 
       else { 
        completionBlock?(nil, error) 
       } 
     } 
    } 


} 

ServiceManger:

typealias ObjectResult = (GenericModel?, ErrorPortage?) -> Void 
typealias ObjectsResult = ([GenericModel]?, ErrorPortage?) -> Void 

extension ServiceManager { 

    static func getUser(_ id: Int? = nil, _ completion: ObjectResult? = nil) { 

     guard let userId: Int = id ?? UserManager.shared.userId else { 

      return 
     } 

     RequestManager.getObject<User>(endpoint: "users/\(userId)") { (user, error) in 
      if user = user { 

       //update userdefault 
       if userId == UserManager.shared.userId { 
        UserDefaults.standard.set(result, forKey: "currentUser") 
       } 
      } 
     } 
    } 
} 

Sur la ligne RequestManager.getObject<User> ... Je reçois cette erreur:

Cannot explicitly specialise a generic type

Alors qu'est-ce qui me manque ici?

The problem was solved thanks to luk2302

Mise à jour Toute idée comment améliorer ce code peut-être ou le rendre plus propre! NB: Ce n'est pas un problème c'est juste de bonnes habitudes de programmation

Répondre

3

Comparer https://stackoverflow.com/a/35372990/2442804 - vous n'êtes pas autorisé à spécifier la contrainte de type "à la main". Vous devez faire en sorte que le compilateur l'infère. Faire via:

RequestManager.getObject(endpoint: "users/\(userId)") { (user : User?, error) in 
    // ... your normal code 
+0

Merci :) Pourriez-vous vérifier ma mise à jour (il est juste d'avoir un code propre et peut-être pour mieux organiser mon code) – Chlebta

+1

@Chlebta Je pencherais pour un ENUM avec des valeurs associées pour la 'erreur 'et le cas de' succès '. De cette façon, vous disposez d'un moyen par compilateur pour recevoir des informations d'erreur ou sur un objet réel. Il y a quelques articles à ce sujet sur SO (ne peut pas les trouver maintenant), entrer dans plus de détails est trop pour la section des commentaires. En dehors de l'énumération, je pense que votre code est correct. – luk2302