Swift: come restituire classe tipo di funzione

So che è possibile il passaggio di classe di tipo di una funzione in swift:

func setGeneric<T>(type: T.Type){ }
setGeneric(Int.self)

Ma come tipo restituito dalla funzione? Scritto qualcosa di simile

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

dà errore del compilatore “Int non è identico a T”. È così possibile per il tipo restituito da una rapida funzione?

Modifica
Qualche spiegazione. Io sono classi che vengono utilizzate per la persistenza (sto usando Reame) e mi sono classi che funge da wrapper intorno a questo classi. Tutti i wrapper eredita da RealmClassWrapper che ha bisogno di sapere che cosa Reame di classe effettivamente avvolge. Diciamo che ho questo reame modello:

class RealmTodo: RLMObject {
   dynamic var title = ""
}

e il mio wrapper cena di classe simile a questo:

class RealmClassWrapper {
   private let backingModel: RLMObject
   //...
   func backingModelType<T>() -> T.Type{ fatalError("must be implemented") }
}

e effettiva wrapper:

class Todo: RealmClassWrapper {
   //some other properties
   func backingModelType<T>() -> T.Type{ return RealmTodo.self }
}

 

4 Replies
  1. 28

    Si può restituire qualsiasi tipo che si desidera.

    func getTypeOfInt()  -> Int.Type  { return Int.self  }
    func getTypeOfBool() -> Bool.Type { return Bool.self }

    Se il tipo non è determinato da argomenti o se il rendimento è costante, non c’è bisogno di introdurre un generico T tipo.

    • Grazie! Che effettivamente risolto il mio problema.
    • Ho appena imbattuto in questo durante la ricerca di come fare questo con i protocolli. Si supponga di avere un pubblico protocollo ImageRendering e privato MyImageRenderer attuazione, si può fare func getRendererType() -> ImageRendering.Type { return MyImageRenderer.self } funzionerà.
  2. 8

    Funziona quando ho modificare la funzione in questo modo:

    func getGeneric<T>(object: T) -> T.Type {
        return T.self
    }
    
    getGeneric(0)    // Swift.Int
    • Grazie per la tua risposta! Tuttavia, il vostro esempio, esamina oggetto e restituisce il tipo, ma voglio creare una funzione che non ha parametri di input e restituisce tipo specificato (come nel mio esempio).
    • Non capisco cosa stai cercando di ottenere. Non voglio params? Che cosa si desidera che la funzione e poi tornare? Sempre dello stesso tipo?
    • Ho aggiornato la mia risposta per fornire un contesto per la mia domanda.
  3. 2

    È possibile forzare l’afflitto (esempio!) come di seguito

    func getGeneric<T>() -> T.Type {
      return Int.self as! T.Type
    } 

    Ma al di fuori dell’ambito della funzione, è necessario indicare il tipo restituito:

    var t:Int.Type = getGeneric()
  4. 0

    Sì, questo è possibile. Il problema qui è che la funzione restituisce un generico T.type, ma è sempre il ritorno Int.type. Dato che T non è sempre un Int, il compilatore genera un errore.

    • Grazie per la tua risposta! Ma ancora non è chiaro a me come potrei tornare Int tipo da una funzione

Lascia un commento