2015-05-05 11 views
10

Sto tentando di memorizzare un tipo in una variabile in modo da poterlo utilizzare più tardi come un tipo di prima classe.Tipo di archivio nella variabile da utilizzare come un tipo successivo

class SomeModel {} 

let someType = SomeModel.self 
let array = Array<someType>() 

In questo caso sicuro che avrei potuto fare Array<SomeModel>() invece ma voglio generalizzare e lasciare sottoclassi forniscono il valore di someType.

Tuttavia ho errori come someType isn't a type o use of undeclared type 'someType' sull'ultima riga.

risposta

10
func someFunc<T>(model: T) -> Array<T> { 
    let array = Array<T>() 
    return array 
} 

let someType = SomeModel.self 
let array = someFunc(someType()) 

Sembra che questo faccia ciò che voglio. L'unico inconveniente è che devo creare un'istanza del tipo desiderato da passare. In questo caso il suo overhead minimo, ma sembra solo uno spreco.

Un'altra cosa con l'utilizzo di generici come questo è che i tipi possibili del generico sono calcolati in fase di compilazione, quindi in fase di esecuzione model.dynamicType non corrisponde necessariamente a T. Nella maggior parte dei casi lo faranno, ma se stai facendo delle cose riflessive, assicurati di controllare bene la tua custodia.

+12

Non è necessario creare un'istanza, si può semplicemente 'func someFunc (modello: T.Type) -> Array {...' – thesummersign

0

In questi giorni, questo può essere più facilmente e facilmente raggiungibile utilizzando .Type su una classe o un protocollo. Notare che solo le funzioni disponibili per tale root class o protocollo saranno accessibili, quindi è necessario assicurarsi che sia definito un inizializzatore richiesto di qualche tipo. Per esempio:

protocol MyClass { 
    init(someValue: Int) 
} 

class MyWrapper { 

    let myClassType: MyClass.Type 

    init(classType: MyClass.Type) { 
     self.myClassType = classType 
    } 

    func new(with value: Int) -> MyClassType { 
     return MyClassType.init(someValue: value) 
    } 

} 

È ora possibile inizializzare questa classe factory piuttosto sciocco con una classe specifica l'attuazione del protocollo di MyClass e quando si chiama la funzione new() con un valore intero che genererà una nuova istanza di quella classe e restituirlo .

Problemi correlati