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
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
@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