437 Stimmen

Erhalten Sie den Klassennamen des Objekts als Zeichenfolge in Swift

Die Klassenbezeichnung eines Objekts als String mit folgendem Code erhalten:

object_getClassName(myViewController)

liefert etwas Ähnliches wie:

_TtC5AppName22CalendarViewController

Ich suche die reine Version: "CalendarViewController". Wie kann ich stattdessen einen bereinigten String des Klassennamens erhalten?

Ich habe einige Versuche von Fragen dazu gefunden, aber keine tatsächliche Antwort. Ist es überhaupt nicht möglich?

32voto

slim Punkte 3952

Swift 3.0

String(describing: MyViewController.self)

Translation:

Swift 3.0

String(describing: MyViewController.self)

29voto

sethfri Punkte 1287

Wenn Sie Typ Foo haben, gibt Ihnen der folgende Code in Swift 3 und Swift 4 "Foo":

let className = String(describing: Foo.self) // Gibt dir "Foo"

Das Problem bei den meisten Antworten hier ist, dass sie Ihnen "Foo.Type" als den resultierenden String geben, wenn Sie keine Instanz des Typs haben, wenn Sie eigentlich nur "Foo" wollen. Das Folgende gibt Ihnen "Foo.Type", wie in vielen anderen Antworten erwähnt.

let className = String(describing: type(of: Foo.self)) // Gibt dir "Foo.Type"

Der Teil type(of:) ist unnötig, wenn Sie nur "Foo" wollen.

25voto

Adam Punkte 4378

In Swift 4.1 und jetzt Swift 4.2 :

import Foundation

class SomeClass {
    class InnerClass {
        let foo: Int

        init(foo: Int) {
            self.foo = foo
        }
    }

    let foo: Int

    init(foo: Int) {
        self.foo = foo
    }
}

class AnotherClass : NSObject {
    let foo: Int

    init(foo: Int) {
        self.foo = foo
        super.init()
    }
}

struct SomeStruct {
    let bar: Int

    init(bar: Int) {
        self.bar = bar
    }
}

let c = SomeClass(foo: 42)
let s = SomeStruct(bar: 1337)
let i = SomeClass.InnerClass(foo: 2018)
let a = AnotherClass(foo: 1<<8)

Wenn Sie keine Instanz haben:

String(describing: SomeClass.self) // Ergebnis: SomeClass
String(describing: SomeStruct.self) // Ergebnis: SomeStruct
String(describing: SomeClass.InnerClass.self) // Ergebnis: InnerClass
String(describing: AnotherClass.self) // Ergebnis: AnotherClass

Wenn Sie eine Instanz haben:

String(describing: type(of: c)) // Ergebnis: SomeClass
String(describing: type(of: s)) // Ergebnis: SomeStruct
String(describing: type(of: i)) // Ergebnis: InnerClass
String(describing: type(of: a)) // Ergebnis: AnotherClass

24voto

Victor Kushnerov Punkte 3688

Swift 5.1

Sie können Klassen-, Struktur-, Enum-, Protokoll- und NSObject-Namen über Self.self erhalten.

print("\(Self.self)")

20voto

Gurjit Singh Punkte 1713

Um den Namen einer Swift-Klasse aus einem Objekt zu erhalten, z.B. für var object: SomeClass(), verwenden Sie

String(describing: type(of: object))

Um den Namen einer Swift-Klasse aus einem Klassentyp zu erhalten, z.B. SomeClass, verwenden Sie:

String(describing: SomeClass.self)

Ausgabe:

"SomeClass"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X