web-dev-qa-db-fra.com

Swift: comment retourner un type de classe depuis une fonction

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 }
}
28
Nikita Arkhipov

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.

27
GoZoner

Cela fonctionne quand je modifie votre fonction comme ceci:

func getGeneric<T>(object: T) -> T.Type {
    return T.self
}

getGeneric(0)    // Swift.Int
8
ayaio

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()
2
jcnm

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.

0
wvteijlingen