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>
?