2014-06-07 2 views
18

C'è un modo semplice per dire quale sia la variabile di istanza class in una Swift? Nei linguaggi basati su JVM a cui sono abituato, puoi fare qualcosa come println(value.class) per ottenere la sua classe.Come posso sapere qual è la classe di una variabile di istanza in Swift

C'è qualcosa di equivalente in Swift?

La cosa più vicina che riesco a trovare nei documenti è la possibilità di eseguire "controllo del tipo" con lo is <Class> keyword ma questo mi aiuta solo a indovinare un po '.

Mi sono imbattuto in un few situations giocando in cui pensavo di avere un tipo di classe, ma in realtà ne avevo un altro e non sapevo come saperlo con certezza.

+0

possibile duplicato di [Come ottenere la classe di una variabile in Swift?] (Http://stackoverflow.com/questions/24097825/how-to-get-the-class-of-a-variable-in- rapido) –

+3

Grazie David, non avevo visto quello nella mia ricerca. È una domanda simile, ma non esattamente la stessa. Questo sta chiedendo come testare se una classe è un tipo particolare (usando 'is', che ho notato sopra). Non voglio testare, voglio stampare il nome della classe così posso vedere di cosa si tratta. –

risposta

25

Utilizzare type.self per restituire un tipo che può essere passato in un metodo che accetta un argomento a livello di carattere. Ad esempio, UILabel.self può essere passato alla chiamata di metodo isKindOfClass. La rappresentazione di stringa della classe possono essere trovati tramite dynamicType.description():

var label = UILabel() 
println(label.dynamicType.description()) 
println(label.isKindOfClass(UILabel.self)) 

Swift-3

var label = UILabel() 
println(type(of: label).description()) 

Output
UILabel
true

Ecco un po 'più di fondo - ci sono due espressioni di essere a conoscenza di: l'espressione auto postfissa e l'espressione di tipo dinamico. Da the docs:

Postfix Self
A postfix self expression consists of an expression or the name of a type, immediately followed by .self. It has the following forms:

expression.self 
type.self 

The first form evaluates to the value of the expression. For example, x.self evaluates to x.

The second form evaluates to the value of the type. Use this form to access a type as a value. For example, because SomeClass.self evaluates to the SomeClass type itself, you can pass it to a function or method that accepts a type-level argument



Dyamic Type Expression
A dynamicType expression consists of an expression, immediately followed by .dynamicType. It has the following form:

expression.dynamicType 

The expression can’t be the name of a type. The entire dynamicType expression evaluates to the value of the runtime type of the expression.

+1

Non vedo un 'description()' nel caso di test che abbia 'let list: String [] = ["foo", "bar", "baz"]; let cdr = list [1..2]; println (cdr.dynamicType.description()); 'ma l'errore che ottengo (' error: 'Slice .Type' non ha un membro chiamato 'description'') mi fornisce le informazioni di cui ho bisogno Segnalo correttamente, grazie! –

+0

@TedNaleid Sì. Alcune classi hanno una funzione di descrizione impostata su di esse, altre no. È ancora presto per la lingua e mi aspetto che in futuro ci sarà un supporto di riflessione molto migliore. – memmons

+1

@TedNaleid: 'description()' è dichiarato come un metodo di classe di 'NSObject', il che significa che è possibile usare solo' .dynamicType.description() 'sulle espressioni con tipo compile-time che è una sottoclasse di' NSObject'.'cdr' ha tipo' Slice ', che non è nemmeno una classe, per non parlare della sottoclasse di' NSObject'. – newacct

6

A partire dal beta 6 _stdlib_getTypeName ottiene il nome del tipo mutilato di una variabile. Incollarlo in un parco vuoto:

import Foundation 

class PureSwiftClass { 
} 

var myvar0 = NSString() // Objective-C class 
var myvar1 = PureSwiftClass() 
var myvar2 = 42 
var myvar3 = "Hans" 

println("TypeName0 = \(_stdlib_getTypeName(myvar0))") 
println("TypeName1 = \(_stdlib_getTypeName(myvar1))") 
println("TypeName2 = \(_stdlib_getTypeName(myvar2))") 
println("TypeName3 = \(_stdlib_getTypeName(myvar3))") 

Il risultato è:

TypeName0 = NSString 
TypeName1 = _TtC13__lldb_expr_014PureSwiftClass 
TypeName2 = _TtSi 
TypeName3 = _TtSS 

Ewan Swick's blog entry aiuta a decifrare queste stringhe:

esempio _TtSi corrisponde al tipo Int interno di Swift.

Mike Ash has a great blog entry covering the same topic.

+1

Ho ricevuto un errore: 'uso dell'identificatore non risolto _stdlib_getTypeName' –