2015-03-05 13 views
12

Ich versuche, eine Variable eines generischen Typs als schwach zu markieren:Klasse nur allgemeine Einschränkungen in Swift

class X<T> { 
    weak var t: T? 
} 

Wenn ich nicht für T in irgendwelchen Einschränkungen setzen erhalte ich den Fehler weak cannot be applied to non-class type 'T'.

Wenn ich nur die Verwendung dieses mit NSObject abgeleiteten Klassen verwenden würde dies funktionieren würde:

class X<T: NSObject> { 
    weak var t: T? 
} 

Aber ich mag auch reine Swift Klassen verwenden können.

Für Protokolle ist es möglich, zu verlangen, dass die Implementierer von Klassentyp ist durch Verwendung des class Stichwort:

protocol ClassType: class { 
} 

Mit dem ClassType Protokoll kann ich markieren nun die Variable als schwach:

class X<T: ClassType> { 
    weak var t: T? 
} 

Aber ich kann das Schlüsselwort class nicht direkt zum generischen Parameter hinzufügen:

class X<T: class> { // Compile error 
    weak var t: T? 
} 

Ich kann das Protokoll Lösung Arbeit für alle NSObject abgeleiteten Klassen mit einer Erweiterung machen:

extension NSObject: ClassType { 
} 

Aber für reine Swift Klassen gibt es keine gemeinsame übergeordnete Klasse, die ich diese Erweiterung hinzufügen könnte. Gibt es eine Möglichkeit, dies ohne Hinzufügen des ClassType Protokolls zu jeder Klasse, die ich verwenden möchte, die X Klasse mit? Z.B. einige spezielle Qualifier für den generischen Parameter wie class X<T:ThisIsAClass>?

Antwort

17

Sie wollen AnyObject, die die Swift docs wie beschreiben:

Das Protokoll, auf das alle Klassen implizit entsprechen.

class X<T: AnyObject> { 
    weak var t: T? 
} 

class C { } 
let x = X<C>() // works fine 
x.t = C() 

// error: type 'Int' does not conform to protocol ‘AnyObject’ 
// (because Int is a struct) 
let y = X<Int>() 
Verwandte Themen