Come faccio a stampare il tipo o la classe di una variabile in Swift?


335

C'è un modo per stampare il tipo di runtime di una variabile in swift? Per esempio:

var now = NSDate()
var soon = now.dateByAddingTimeInterval(5.0)

println("\(now.dynamicType)") 
// Prints "(Metatype)"

println("\(now.dynamicType.description()")
// Prints "__NSDate" since objective-c Class objects have a "description" selector

println("\(soon.dynamicType.description()")
// Compile-time error since ImplicitlyUnwrappedOptional<NSDate> has no "description" method

Nell'esempio sopra, sto cercando un modo per mostrare che la variabile "presto" è di tipo ImplicitlyUnwrappedOptional<NSDate>, o almeno NSDate!.


43
@JasonMArcher Dimmi come è un duplicato se la domanda che hai collegato è stata posta 4 giorni dopo questa?
Akashivskyy,

Esistono diverse domande sul test del tipo di oggetto Swift o sulla lettura del tipo di oggetto Swift. Stiamo solo trovando le domande migliori da utilizzare come domande "principali" per questo argomento. Il duplicato suggerito ha una risposta molto più approfondita. Questo non vuol dire che hai fatto qualcosa di sbagliato, solo che stiamo cercando di ridurre il disordine.
JasonMArcher,

4
Il duplicato suggerito non risponde alla stessa domanda; Type.self non può essere stampato sulla console ai fini del debug, ma deve essere utilizzato per passare ad altre funzioni che accettano i tipi come oggetti.
Matt Bridges,

2
OT: Molto strano che Swift non lo offra fuori dagli schemi e uno deve armeggiare con librerie C di livello così basso. Vale la pena segnalare un bug?
qwerty_so,

Ragazzi, ho fornito la mia risposta qui sotto. Dai un'occhiata e fammi sapere se è quello che ci si aspetta.
DILIP KOSURI,

Risposte:


377

Aggiornamento settembre 2016

Swift 3.0: utilizzare type(of:), ad es. type(of: someThing)(Poiché la dynamicTypeparola chiave è stata rimossa)

Aggiornamento ottobre 2015 :

Ho aggiornato gli esempi seguenti con la nuova sintassi di Swift 2.0 (ad es. È printlnstato sostituito con print, lo toString()è ora String()).

Dalle note sulla versione di Xcode 6.3 :

@nschum sottolinea nei commenti che le note di rilascio di Xcode 6.3 mostrano un altro modo:

I valori del tipo ora vengono stampati come nome completo del tipo smangolato se utilizzati con println o interpolazione di stringhe.

import Foundation

class PureSwiftClass { }

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

print( "String(myvar0.dynamicType) -> \(myvar0.dynamicType)")
print( "String(myvar1.dynamicType) -> \(myvar1.dynamicType)")
print( "String(myvar2.dynamicType) -> \(myvar2.dynamicType)")
print( "String(myvar3.dynamicType) -> \(myvar3.dynamicType)")

print( "String(Int.self)           -> \(Int.self)")
print( "String((Int?).self         -> \((Int?).self)")
print( "String(NSString.self)      -> \(NSString.self)")
print( "String(Array<String>.self) -> \(Array<String>.self)")

Quali uscite:

String(myvar0.dynamicType) -> __NSCFConstantString
String(myvar1.dynamicType) -> PureSwiftClass
String(myvar2.dynamicType) -> Int
String(myvar3.dynamicType) -> String
String(Int.self)           -> Int
String((Int?).self         -> Optional<Int>
String(NSString.self)      -> NSString
String(Array<String>.self) -> Array<String>

Aggiornamento per Xcode 6.3:

Puoi usare _stdlib_getDemangledTypeName():

print( "TypeName0 = \(_stdlib_getDemangledTypeName(myvar0))")
print( "TypeName1 = \(_stdlib_getDemangledTypeName(myvar1))")
print( "TypeName2 = \(_stdlib_getDemangledTypeName(myvar2))")
print( "TypeName3 = \(_stdlib_getDemangledTypeName(myvar3))")

e ottieni questo come output:

TypeName0 = NSString
TypeName1 = __lldb_expr_26.PureSwiftClass
TypeName2 = Swift.Int
TypeName3 = Swift.String

Risposta originale:

Prima di Xcode 6.3 ha _stdlib_getTypeNameottenuto il nome del tipo alterato di una variabile. Il blog di Ewan Swick aiuta a decifrare queste stringhe:

ad esempio _TtSista per il Inttipo interno di Swift .

Mike Ash ha un bellissimo post sul blog che tratta lo stesso argomento .


2
Come hai trovato _stdlib_getTypeName()? Il REPL integrato non esiste più, swift-ide-testnon esiste nemmeno e la stampa di Xcode del modulo Swift _elide i valori prefissati.
Lily Ballard,

10
Sembra che riesca a cercare simboli con lldbabbastanza facilmente nel sostituto. C'è anche _stdlib_getDemangledTypeName(), e _stdlib_demangleName().
Lily Ballard

1
Oh pulito, non mi ero reso conto che imagefosse una scorciatoia per target modules. Ho finito per usare target modules lookup -r -n _stdlib_, che ovviamente è meglio espresso comeimage lookup -r -n _stdlib_ libswiftCore.dylib
Lily Ballard

1
Cordiali saluti - Sembra che ToString (...) sia stato sostituito con String (...).
Nick,

6
Swift 3.0: la dynamicTypeparola chiave è stata rimossa da Swift. Al suo posto type(of:)è stata aggiunta una nuova funzione primitiva alla lingua: github.com/apple/swift/blob/master/CHANGELOG.md
Szu

46

Modifica: una nuova toStringfunzione è stata introdotta in Swift 1.2 (Xcode 6.3) .

Ora puoi stampare il tipo di demangled di qualsiasi tipo usando .selfe qualsiasi istanza usando .dynamicType:

struct Box<T> {}

toString("foo".dynamicType)            // Swift.String
toString([1, 23, 456].dynamicType)     // Swift.Array<Swift.Int>
toString((7 as NSNumber).dynamicType)  // __NSCFNumber

toString((Bool?).self)                 // Swift.Optional<Swift.Bool>
toString(Box<SinkOf<Character>>.self)  // __lldb_expr_1.Box<Swift.SinkOf<Swift.Character>>
toString(NSStream.self)                // NSStream

Prova a chiamare YourClass.selfe yourObject.dynamicType.

Riferimento: https://devforums.apple.com/thread/227425 .


2
Ho risposto a quella discussione, ma aggiungerò il mio commento qui. Questi valori sono di tipo "Metatype", ma non sembra esserci un modo semplice per capire quale tipo rappresenta un oggetto Metatype, che è quello che sto cercando.
Matt Bridges,

Sono di tipo Metatype e sono classi. Rappresentano una classe. Non sono sicuro di quale sia il tuo problema. someInstance.dynamicType.printClassName()stamperà il nome della classe.
File analogico

18
il metodo printClassName () è solo un metodo di esempio che hanno creato in uno degli esempi nei documenti, non è una chiamata API a cui è possibile accedere.
Dave Wood,

4
FYI - Sembra che ToString (...) sia stato sostituito con String (...)
Nick,

33

Swift 3.0

let string = "Hello"
let stringArray = ["one", "two"]
let dictionary = ["key": 2]

print(type(of: string)) // "String"

// Get type name as a string
String(describing: type(of: string)) // "String"
String(describing: type(of: stringArray)) // "Array<String>"
String(describing: type(of: dictionary)) // "Dictionary<String, Int>"

// Get full type as a string
String(reflecting: type(of: string)) // "Swift.String"
String(reflecting: type(of: stringArray)) // "Swift.Array<Swift.String>"
String(reflecting: type(of: dictionary)) // "Swift.Dictionary<Swift.String, Swift.Int>"

1
L'implementazione di Swift 2 è particolarmente piacevole con i casi enum. Qualcuno sa se questo comportamento è documentato / garantito da Apple? La libreria standard include semplicemente un commento che questo è adatto per il debug ...
milos

30

È questo quello che stai cercando?

println("\(object_getClassName(now))");

Stampa "__NSDate"

AGGIORNAMENTO : Nota che questo non funziona più a partire da Beta05


2
Non funziona per le classi veloci. Restituisce "UnsafePointer (0x7FBB18D06DE0)"
aryaxt

4
Non funziona neanche per le classi ObjC (almeno in Beta5), per un NSManagedObject ottengo solo "Builtin.RawPointer = address"
Kendall Helmstetter Gelner

23

Il mio attuale Xcode è la versione 6.0 (6A280e).

import Foundation

class Person { var name: String; init(name: String) { self.name = name }}
class Patient: Person {}
class Doctor: Person {}

var variables:[Any] = [
    5,
    7.5,
    true,
    "maple",
    Person(name:"Sarah"),
    Patient(name:"Pat"),
    Doctor(name:"Sandy")
]

for variable in variables {
    let typeLongName = _stdlib_getDemangledTypeName(variable)
    let tokens = split(typeLongName, { $0 == "." })
    if let typeName = tokens.last {
        println("Variable \(variable) is of Type \(typeName).")
    }
}

Produzione:

Variable 5 is of Type Int.
Variable 7.5 is of Type Double.
Variable true is of Type Bool.
Variable maple is of Type String.
Variable Swift001.Person is of Type Person.
Variable Swift001.Patient is of Type Patient.
Variable Swift001.Doctor is of Type Doctor.

1
Bene, ma la domanda includeva anche Optionals, l'output degli optionals è impostato in Optional(...)modo che il tuo codice ritorni solo Optionalcome Tipo. Dovrebbe anche mostrare var optionalTestVar: Person? = Person(name:"Sarah")come Opzionale (Persona) e var con Persona! come ImplicitlyUnwrappedOptional (Person)
Binarian

18

A partire da Xcode 6.3 con Swift 1.2, puoi semplicemente convertire i valori di tipo in tutto il demangled String.

toString(Int)                   // "Swift.Int"
toString(Int.Type)              // "Swift.Int.Type"
toString((10).dynamicType)      // "Swift.Int"
println(Bool.self)              // "Swift.Bool"
println([UTF8].self)            // "Swift.Array<Swift.UTF8>"
println((Int, String).self)     // "(Swift.Int, Swift.String)"
println((String?()).dynamicType)// "Swift.Optional<Swift.String>"
println(NSDate)                 // "NSDate"
println(NSDate.Type)            // "NSDate.Type"
println(WKWebView)              // "WKWebView"
toString(MyClass)               // "[Module Name].MyClass"
toString(MyClass().dynamicType) // "[Module Name].MyClass"

L'altra direzione è possibile in 1.2? Inizializzare un'istanza in base al nome della classe?
user965972,

@ user965972 Per quanto ne so non credo che ce ne sia.
Kiding

17

Puoi ancora accedere alla classe, tramite className(che restituisce a String).

In realtà ci sono diversi modi per ottenere la classe, per esempio classForArchiver, classForCoder, classForKeyedArchiver(tutti di ritorno AnyClass!).

Non è possibile ottenere il tipo di primitiva (una primitiva non è una classe).

Esempio:

var ivar = [:]
ivar.className // __NSDictionaryI

var i = 1
i.className // error: 'Int' does not have a member named 'className'

Se vuoi ottenere il tipo di primitiva, devi usare bridgeToObjectiveC(). Esempio:

var i = 1
i.bridgeToObjectiveC().className // __NSCFNumber

Scommetto che è un primitivo. Sfortunatamente non puoi ottenere il tipo di primitiva.
Leandros,

Questi esempi non sembrano funzionare nel parco giochi. Ottengo l'errore sia per i primitivi che per i non primitivi.
Matt Bridges,

prova a import Cocoa.
Leandros,

9
className sembra essere disponibile solo per NSObjects durante lo sviluppo per OSX; non è disponibile in iOS SDK per oggetti NSO o oggetti "normali"
Matt Bridges

3
classNamefa parte del supporto AppleScript di Cocoa e non dovrebbe assolutamente essere utilizzato per introspezione generica. Ovviamente non è disponibile su iOS.
Nikolai Ruhe,

16

È possibile utilizzare reflection per ottenere informazioni sull'oggetto.
Ad esempio il nome della classe di oggetti:

var classname = reflection (ora) .summary

In Beta 6, questo mi ha dato il nome dell'app + il nome della classe in una forma leggermente distorta, ma è un inizio. +1 per reflect(x).summary- grazie!
Olie,

non ha funzionato, stampa una riga vuota in Swift 1.2 Xcode 6.4 e iOs 8.4
Juan Boero

13

Ho avuto fortuna con:

let className = NSStringFromClass(obj.dynamicType)

@hdost amico non ha funzionato ma classForCoder ha funzionato.
Satheeshwaran,

12

Xcode 8 Swift 3.0 usa il tipo (di :)

let className = "\(type(of: instance))"

10

In Xcode 8, Swift 3.0

passi:

1. Ottieni il tipo:

Opzione 1:

let type : Type = MyClass.self  //Determines Type from Class

Opzione 2:

let type : Type = type(of:self) //Determines Type from self

2. Converti il ​​tipo in stringa:

let string : String = "\(type)" //String

8

In Swift 3.0, puoi utilizzare type(of:), poiché la dynamicTypeparola chiave è stata rimossa.


7

SWIFT 5

Con l'ultima versione di Swift 3 possiamo ottenere belle descrizioni dei nomi dei tipi attraverso l' Stringinizializzatore. Ad esempio print(String(describing: type(of: object))). Dove object può essere una variabile di istanza come array, un dizionario, an Int, a NSDate, un'istanza di una classe personalizzata, ecc.

Ecco la mia risposta completa: Ottieni il nome della classe dell'oggetto come stringa in Swift

Quella domanda è alla ricerca di un modo per ottenere il nome della classe di un oggetto come stringa, ma ho anche proposto un altro modo per ottenere il nome della classe di una variabile di cui non è una sottoclasse NSObject. Ecco qui:

class Utility{
    class func classNameAsString(obj: Any) -> String {
        //prints more readable results for dictionaries, arrays, Int, etc
        return String(describing: type(of: obj))
    }
}

Ho creato una funzione statica che accetta come parametro un oggetto di tipo Anye restituisce il nome della sua classe come String:).

Ho testato questa funzione con alcune variabili come:

    let diccionary: [String: CGFloat] = [:]
    let array: [Int] = []
    let numInt = 9
    let numFloat: CGFloat = 3.0
    let numDouble: Double = 1.0
    let classOne = ClassOne()
    let classTwo: ClassTwo? = ClassTwo()
    let now = NSDate()
    let lbl = UILabel()

e l'output era:

  • diccionary è di tipo Dizionario
  • array è di tipo Array
  • numInt è di tipo Int
  • numFloat è di tipo CGFloat
  • numDouble è di tipo Double
  • classOne è di tipo: ClassOne
  • classTwo è di tipo: ClassTwo
  • ora è di tipo: data
  • lbl è di tipo: UILabel

5

Quando si utilizza Cocoa (non CocoaTouch), è possibile utilizzare la classNameproprietà per oggetti che sono sottoclassi di NSObject.

println(now.className)

Questa proprietà non è disponibile per i normali oggetti Swift, che non sono sottoclassi di NSObject (e in effetti, non vi è alcun ID root o tipo di oggetto in Swift).

class Person {
    var name: String?
}

var p = Person()
println(person.className) // <- Compiler error

In CocoaTouch, al momento non esiste un modo per ottenere una descrizione stringa del tipo di una determinata variabile. Funzionalità simili non esistono anche per i tipi primitivi in ​​Cocoa o CocoaTouch.

Swift REPL è in grado di stampare un riepilogo dei valori incluso il suo tipo, quindi è possibile che questo modo di introspezione sia possibile in futuro tramite un'API.

EDIT : dump(object)sembra fare il trucco.


Anche a partire da Xcode 10 e Swift 4.2, dump(object)è davvero potente. Grazie.
Alex Zavatone,

5

La risposta migliore non ha un esempio funzionante del nuovo modo di farlo usando type(of:. Quindi, per aiutare i principianti come me, ecco un esempio funzionante, tratto principalmente dai documenti di Apple qui - https://developer.apple.com/documentation/swift/2885064-type

doubleNum = 30.1

func printInfo(_ value: Any) {
    let varType = type(of: value)
    print("'\(value)' of type '\(varType)'")
}

printInfo(doubleNum)
//'30.1' of type 'Double'

4

Ho provato alcune delle altre risposte qui, ma il milage sembra molto su quale sia l'oggetto sottostante.

Tuttavia, ho trovato un modo per ottenere il nome della classe Object-C per un oggetto nel modo seguente:

now?.superclass as AnyObject! //replace now with the object you are trying to get the class name for

Ecco un esempio di come lo useresti:

let now = NSDate()
println("what is this = \(now?.superclass as AnyObject!)")

In questo caso stamperà NSDate nella console.


4

Ho trovato questa soluzione che si spera possa funzionare per qualcun altro. Ho creato un metodo di classe per accedere al valore. Tieni presente che funzionerà solo per la sottoclasse NSObject. Ma almeno è una soluzione pulita e ordinata.

class var className: String!{
    let classString : String = NSStringFromClass(self.classForCoder())
    return classString.componentsSeparatedByString(".").last;
}

4

Nell'ultimo XCode 6.3 con Swift 1.2, questo è l'unico modo in cui ho trovato:

if view.classForCoder.description() == "UISegment" {
    ...
}

NOTA: description () restituisce il nome della classe nel formato <swift module name>.<actual class name>, quindi si desidera dividere la stringa con a .e ottenere l'ultimo token.
Matthew Quiros,

4

Molte delle risposte qui non funzionano con l'ultimo Swift (Xcode 7.1.1 al momento della scrittura).

Il modo attuale di ottenere le informazioni è creare un Mirrore interrogarlo. Per il nome della classe è semplice come:

let mirror = Mirror(reflecting: instanceToInspect)
let classname:String = mirror.description

Ulteriori informazioni sull'oggetto possono anche essere recuperate dal Mirror. Vedi http://swiftdoc.org/v2.1/type/Mirror/ per i dettagli.


Cosa c'è di sbagliato con le risposte stackoverflow.com/a/25345480/1187415 e stackoverflow.com/a/32087449/1187415 ? Entrambi sembrano funzionare abbastanza bene con Swift 2. (Non ho controllato gli altri.)
Martin R

Mi piace come una soluzione generale, ma ottenere "Mirror for ViewController" ("Mirror for" estraneo) - aspetta, sembra che usare ".subjectType" faccia il trucco!
David H,

3

In lldb a partire da beta 5, puoi vedere la classe di un oggetto con il comando:

fr v -d r shipDate

che produce qualcosa di simile:

(DBSalesOrderShipDate_DBSalesOrderShipDate_ *) shipDate = 0x7f859940

Il comando espanso significa qualcosa del tipo:

Frame Variable (stampa una variabile di frame) -d run_target (espandi tipi dinamici)

Qualcosa di utile da sapere è che l'uso di "Frame Variable" per generare valori variabili garantisce che non venga eseguito alcun codice.


3

Ho trovato una soluzione per lezioni auto-sviluppate (o simili a cui hai accesso).

Inserire la seguente proprietà calcolata nella definizione della classe degli oggetti:

var className: String? {
    return __FILE__.lastPathComponent.stringByDeletingPathExtension
}

Ora puoi semplicemente chiamare il nome della classe sul tuo oggetto in questo modo:

myObject.className

Nota che funzionerà solo se la tua definizione di classe viene fatta all'interno di un file che è chiamato esattamente come la classe di cui desideri il nome.

Poiché questo è comunemente il caso, la risposta sopra dovrebbe farlo nella maggior parte dei casi . Ma in alcuni casi speciali potresti dover trovare una soluzione diversa.


Se hai bisogno del nome della classe all'interno della classe (file) stessa , puoi semplicemente usare questa riga:

let className = __FILE__.lastPathComponent.stringByDeletingPathExtension

Forse questo metodo aiuta alcune persone là fuori.


3

Sulla base delle risposte e dei commenti forniti da Klass e Kevin Ballard sopra, vorrei andare con:

println(_stdlib_getDemangledTypeName(now).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(soon).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(soon?).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(soon!).componentsSeparatedByString(".").last!)

println(_stdlib_getDemangledTypeName(myvar0).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(myvar1).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(myvar2).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(myvar3).componentsSeparatedByString(".").last!)

che stamperà:

"NSDate"
"ImplicitlyUnwrappedOptional"
"Optional"
"NSDate"

"NSString"
"PureSwiftClass"
"Int"
"Double"

Penso che questa sia la risposta migliore.
maschall

Ho finito per usare in Swift 1.2 quanto segue toString(self.dynamicType).componentsSeparatedByString(".").last!:, ovviamente, ero in un contesto di oggetto e potevo fare riferimento self.
Joe,

3
let i: Int = 20


  func getTypeName(v: Any) -> String {
    let fullName = _stdlib_demangleName(_stdlib_getTypeName(i))
    if let range = fullName.rangeOfString(".") {
        return fullName.substringFromIndex(range.endIndex)
    }
    return fullName
}

println("Var type is \(getTypeName(i)) = \(i)")

3

Swift versione 4:

print("\(type(of: self)) ,\(#function)")
// within a function of a class

Grazie @Joshua Dance


3

Swift 4:

// "TypeName"
func stringType(of some: Any) -> String {
    let string = (some is Any.Type) ? String(describing: some) : String(describing: type(of: some))
    return string
}

// "ModuleName.TypeName"
func fullStringType(of some: Any) -> String {
    let string = (some is Any.Type) ? String(reflecting: some) : String(reflecting: type(of: some))
    return string
}

Uso:

print(stringType(of: SomeClass()))     // "SomeClass"
print(stringType(of: SomeClass.self))  // "SomeClass"
print(stringType(of: String()))        // "String"
print(fullStringType(of: String()))    // "Swift.String"

2

Non sembra esserci un modo generico per stampare il nome del tipo di un valore di valore arbitrario. Come altri hanno già notato, per le istanze di classe è possibile stamparevalue.className ma per i valori primitivi sembra che in fase di esecuzione le informazioni sul tipo siano sparite.

Ad esempio, sembra che non ci sia un modo per digitare: 1.something()e uscire Intper qualsiasi valore di something. (È possibile, come suggerito da un'altra risposta, utilizzare i.bridgeToObjectiveC().classNameper darti un suggerimento, ma in realtà non__NSCFNumber è il tipo di - proprio in cosa verrà convertito quando attraversa il confine di una chiamata di funzione Objective-C.)i

Sarei felice di essere smentito, ma sembra che il controllo del tipo sia tutto fatto in fase di compilazione, e come il C ++ (con RTTI disabilitato) gran parte delle informazioni sul tipo sono andate in fase di esecuzione.


Puoi fare un esempio dell'uso di className per stampare "NSDate" per la variabile "now" nel mio esempio che funziona nel parco giochi di Xcode6? Per quanto ne so, className non è definito sugli oggetti Swift, anche quelli che sono sottoclassi di NSObject.
Matt Bridges,

Sembra che 'className' sia disponibile per oggetti che discendono da NSObject, ma solo durante lo sviluppo per mac, non per iOS. Sembra che non ci sia alcuna soluzione alternativa per iOS.
Matt Bridges,

1
Sì, il vero takeaway qui sembra essere che, nel caso generale, le informazioni sui tipi sono sparite in fase di esecuzione in breve tempo.
ipmcc

Sono curioso di sapere come il REPL è in grado di stampare i tipi di valori, però.
Matt Bridges

Il REPL è quasi certamente interpretato e non compilato, il che spiegherebbe facilmente
ipmcc

2

Questo è il modo in cui ottieni una stringa di tipo del tuo oggetto o Tipo che è coerente e prende in considerazione a quale modulo appartiene la definizione dell'oggetto o in cui è nidificato. Funziona in Swift 4.x.

@inline(__always) func typeString(for _type: Any.Type) -> String {
    return String(reflecting: type(of: _type))
}

@inline(__always) func typeString(for object: Any) -> String {
    return String(reflecting: type(of: type(of: object)))
}

struct Lol {
    struct Kek {}
}

// if you run this in playground the results will be something like
typeString(for: Lol.self)    //    __lldb_expr_74.Lol.Type
typeString(for: Lol())       //    __lldb_expr_74.Lol.Type
typeString(for: Lol.Kek.self)//    __lldb_expr_74.Lol.Kek.Type
typeString(for: Lol.Kek())   //    __lldb_expr_74.Lol.Kek.Type

2

Per ottenere un tipo di oggetto o una classe di oggetti in Swift , è necessario utilizzare un tipo (di: yourObject)

tipo (di: yourObject)


1

Non esattamente quello che stai cercando, ma puoi anche controllare il tipo di variabile rispetto ai tipi Swift in questo modo:

let object: AnyObject = 1

if object is Int {
}
else if object is String {
}

Per esempio.


1

Xcode 7.3.1, Swift 2.2:

String(instanceToPrint.self).componentsSeparatedByString(".").last

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.