2014-07-04 21 views
15

Il codice seguente stampa nil, nonostante ListCell è una classe valida.NSClassFromString() restituisce sempre zero

var lCellClass : AnyClass! = NSClassFromString("ListCell"); 

println(lCellClass); 

I documenti dicono che metodo restituisce

L'oggetto di classe nominato da aClassName, o nil se nessuna classe con quel nome è attualmente caricato. Se aClassName è nil, restituisce nil.

Ho anche cercato di ottenere NSClassFromString() di viewcontroller corrente che viene caricato, ma ancora ottenere nil

Quale può essere il problema?

Aggiornamento: Anche cercando di fare questo NSClassFromString("Array") ho ancora nil

+2

"Anche provando a fare questo NSClassFromString (" Array ") ottengo ancora nil" Array è una struct, non una classe. –

risposta

54

La NSClassFromString funzione fa lavoro per (puro e Objective-C-derivato) classi veloci, ma solo se si utilizza il pieno nome qualificato.

Per esempio, in un progetto chiamato MyApp con una classe rapida puro chiamato Person:

let personClass: AnyClass? = NSClassFromString("MyApp.Person") 

Vedi Utilizzando Swift nomi di classe con Objective-C API in Using Swift With Cocoa and Objective-C per ulteriori informazioni.

+2

Interessante! Grazie per quello. – dasdom

+1

Ed è per questo che mi piace così tanto !! –

+1

Funziona bene. Grazie. – azimov

7

È anche possibile specificare un nome per il simbolo in Objective-C che omette lo spazio dei nomi nell'obiettivo C utilizzando l'annotazione @objc. Se si preferisce utilizzare il nome senza il modulo, basta usare lo stesso nome della classe:

@objc(Foobar) 
class Foobar{ 

} 

NSClassFromString ("Foobar") restituirà la classe Foobar.

+0

Questa è la risposta più pertinente, infatti. Grazie. –

+0

Non si dovrebbe fare questo solo per digitare un po 'meno quando si usa 'NSClassFromString'. Perdi tutti i vantaggi del namespace. Sei * non * "defin [ing] lo spazio dei nomi della classe veloce", si * * rimuovendo tutti namespacing. –

+0

L'obiettivo C supporta ora gli spazi dei nomi? – Osmund

0

Questo problema può essere che la classe non hanno estendersi da NSObject. Come per impostazione predefinita, swift non ha la superclasse.

Problemi correlati