2015-09-05 8 views
5

zu verwenden Ich muss einen Typ in meiner generischen Basisklasse übergeben.Wie AnyClass in Swift Generic Klasse

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

bekomme ich folgende Fehlermeldung:

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

Ideal als eine bestimmte Art zu sein, ich mag ‚T‘ verwenden, anstatt AnyClass, aber AnyClass ist OK auch.

Dank

Antwort

3

Statt T Bedürfnisse der Angabe einer Klasse sein, könnte man stattdessen tun:

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

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

Wenn Sie planen, eine Menge kann es zu verwenden T.Type eine typealias Verwendung wert sein:

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

Einige Beispiel-Anwendung:

let base = SomeBaseClass(type: String.self) 

Und Vorteil dieser Methode ist T.Type könnte Strukturen und enums, sowie Klassen darstellen.

+0

Das ist ziemlich interessant, ich werde es versuchen. – Peymankh

+0

Ordentlich. Danke, das würde es tun. – Peymankh

1

Sie sollten AnyObject verwenden, wenn der Typ eine Klasse sein soll.

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

Sie diesen Trick tun können:

protocol P {} 

class C: P {} 

class C1<T: P> {} 

let c1 = C1<C>() 

In diesem Fall, dass Sie Sie Klasse wickeln C mit Protokoll P, dann können Sie C1 neue generische Klasse zu schaffen, wo T Ihr Protokoll ist P. Damit können Sie eine Instanz der Klasse C1 mit der generischen Parameterklasse C erstellen.

Verwandte Themen