Je sais qu'il est possible de passer le type de classe à une fonction dans Swift:
func setGeneric<T>(type: T.Type){ }
setGeneric(Int.self)
Mais comment pouvons-nous retourner le type de fonction? Écrire quelque chose comme
func getGeneric<T>() -> T.Type {
return Int.self
}
donne l'erreur de compilation "Int n'est pas identique à T". Alors, est-il possible de retourner le type à partir d'une fonction Swift?
Modifier
Quelques explications. J'ai des classes qui sont utilisées pour la persistance (j'utilise Realm) et des classes qui agissent comme des wrappers autour de ces classes. Tous les wrappers héritent de RealmClassWrapper
qui a besoin de savoir quelle classe de domaine elle enveloppe réellement. Alors disons que j'ai ce modèle de royaume:
class RealmTodo: RLMObject {
dynamic var title = ""
}
et mon cours de souper d'habillage ressemble à ceci:
class RealmClassWrapper {
private let backingModel: RLMObject
//...
func backingModelType<T>() -> T.Type{ fatalError("must be implemented") }
}
et emballage actuel:
class Todo: RealmClassWrapper {
//some other properties
func backingModelType<T>() -> T.Type{ return RealmTodo.self }
}
Vous pouvez retourner n'importe quel type que vous voulez.
func getTypeOfInt() -> Int.Type { return Int.self }
func getTypeOfBool() -> Bool.Type { return Bool.self }
Si le type n'est pas déterminé à partir d'arguments ou si le retour est constant, il n'est pas nécessaire d'introduire un type générique T
.
Cela fonctionne quand je modifie votre fonction comme ceci:
func getGeneric<T>(object: T) -> T.Type {
return T.self
}
getGeneric(0) // Swift.Int
Vous pouvez forcer le downcast (comme!) Comme ci-dessous
func getGeneric<T>() -> T.Type {
return Int.self as! T.Type
}
Mais hors de la portée de la fonction, vous devez indiquer le type renvoyé:
var t:Int.Type = getGeneric()
Oui, c'est possible Le problème ici est que vous dites que votre fonction renvoie un T.type
générique, mais que vous renvoyez toujours Int.type
. Puisque T n’est pas toujours un Int, le compilateur lève une erreur.