2015-09-05 18 views
5

Ho bisogno di passare un tipo nella mia classe base generica.Come utilizzare AnyClass in Swift Classe generica

class SomeBaseClass<T: AnyClass> { 
    // Implementation Goes here 
} 

ottengo il seguente errore:

Inheritance from non-protocol, non-class type 'AnyClass' (aka 'AnyObject.Type')

Idealmente vorrei usare 'T' per essere come un tipo specifico piuttosto che AnyClass, ma AnyClass è giusta pure.

Grazie

risposta

3

Invece di specificare T ha bisogno di essere una classe, si potrebbe invece fare:

class SomeBaseClass<T> { 
    let type: T.Type 

    init(type: T.Type) { 
     self.type = type 
    } 
} 

Se hai intenzione di utilizzare T.Type molto può valere la pena utilizzando un typealias:

class SomeBaseClass<T> { 
    typealias Type = T.Type 
    let type: Type 
    ... 
} 

Qualche esempio di utilizzo:

let base = SomeBaseClass(type: String.self) 

E il vantaggio di questo metodo è T.Type potrebbe rappresentare le strutture e le enumerazioni, nonché le classi.

+0

Questo è piuttosto interessante, ci provo. – Peymankh

+0

Neat. Grazie, lo farebbe. – Peymankh

1

È necessario utilizzare AnyObject se si desidera che il tipo sia una classe.

class SomeBaseClass<T: AnyObject> { 
    // Implementation Goes here 
} 

// Legal because UIViewController is a class 
let o1 = SomeBaseClass<UIViewController>() 

// Illegal (won't compile) because String is a struct 
let o2 = SomeBaseClass<String>() 
1

È possibile fare questo trucco:

protocol P {} 

class C: P {} 

class C1<T: P> {} 

let c1 = C1<C>() 

In questo caso si avvolgerà classe C con protocollo P, allora sei in grado di creare nuova classe generica C1 dove T è il protocollo P. Questo ti consente di creare istanza della classe C1 con la classe parametro generica C.

Problemi correlati