2017-09-25 4 views
1

J'ai un protocole Mappable implémentant une classe et je veux passer le type en paramètre à une fonction et obtenir une instance de cet objet, mais le type peut également être un type primitif.Instanciation rapide à partir du type générique

class MyMappable : Mappable { 

    required init?(map: Map) { 

     print("i am custom mappable") 
    } 
} 

func getInstance<T>() -> T{ 

    if T.self == Int.self { 

     return 10 as T 
    } 

    if T.self is Mappable.self { 
     return T(Json : [:]) //this is the problem, T is not Mappable 
    } 

} 

Ce que j'ai essayé est de créer 2 override getInstance comme ceci:

func getInstance<T>() -> T{} 

func getInstance<T : Mappable>() -> T{} 

mais pour plusieurs types, il peut être beaucoup de dérogation. Y at-il un moyen de laisser savoir rapidement que T est mappable en première fonction?

Répondre

0

Vous pouvez conditionnellement jeté à un Mappable comme celui-ci (non testé):

if let MappableType = T.self as? Mappable.self { 
    return MappableType(Json : [:]) 
} 

noms Habituellement variables sont en minuscules mais dans ce cas je peux imaginer utiliser des majuscules car il est utilisé comme un type.

Vous pouvez également le faire différemment en fonction de votre utilisation/site d'appel.

Que diriez-vous contraindre la méthode getInstance<T>() -> T:

getInstance<T: Mappable>() -> T