2015-03-05 20 views
12

Sto cercando di segnare una variabile di un tipo generico debole:classe di sola vincoli generici a Swift

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

Se non metto in alcun vincolo per T ottengo l'errore weak cannot be applied to non-class type 'T'.

Se Vorrei usare solo per uso questo con le classi derivate NSObject questo dovrebbe funzionare:

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

ma voglio anche essere in grado di utilizzare le classi Swift puri.

Per i protocolli è possibile richiedere che l'implementor è di tipo classe utilizzando la parola chiave class:

protocol ClassType: class { 
} 

Con il protocollo ClassType ora può segnare la variabile come deboli:

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

Ma non posso aggiungere la parola chiave class direttamente al parametro generico:

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

posso fare il lavoro soluzione di protocollo per tutte le classi derivate NSObject con un'estensione:

extension NSObject: ClassType { 
} 

Ma per le classi Swift pure non v'è alcuna superclasse comune che potrei aggiungere questa estensione per. C'è un modo per farlo funzionare senza aggiungere il protocollo ClassType ad ogni classe con cui voglio usare la classe X? Per esempio. qualche qualificatore speciale per il parametro generico come class X<T:ThisIsAClass>?

risposta

17

Volete AnyObject, che la documentazione Swift descrivono come:

Il protocollo a cui tutte le classi implicitamente conformi.

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>() 
Problemi correlati