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?

4voto

Ivan Tkachenko Punkte 470

Dies ist ein Beispiel für die Klasse var. Enthalte nicht den Namen des Bündels.

extension NSObject {
    class var className: String {
        return "\(self)"
    }
}

4voto

Darkwonder Punkte 899

Die oben genannten Lösungen haben bei mir nicht funktioniert. Sie haben größtenteils die Probleme verursacht, die in mehreren Kommentaren erwähnt wurden:

MyAppName.ClassName

oder

MyFrameWorkName.ClassName

Diese Lösungen haben mit XCode 9, Swift 3.0 funktioniert:

Ich habe es classNameCleaned genannt, damit es einfacher zugänglich ist und nicht mit zukünftigen Änderungen von className() kollidiert:

extension NSObject {

static var classNameCleaned : String {

    let className = self.className()
    if className.contains(".") {
        let namesArray = className.components(separatedBy: ".")
        return namesArray.last ?? className
    } else {
        return self.className()
    }

}

}

Verwendung:

NSViewController.classNameCleaned
MyCustomClass.classNameCleaned

4voto

Blazej SLEBODA Punkte 7468

Swift 5

 NSStringFromClass(CustomClass.self)

Translated to:

Swift 5

 NSStringFromClass(CustomClass.self)

4voto

drawnonward Punkte 52834

Probieren Sie reflect().summary auf Class self oder Instanz dynamicType aus. Entpacken Sie die Optionals, bevor Sie dynamicType erhalten, da andernfalls der dynamicType der Optional-Wrapper ist.

class SampleClass { class InnerClass{} }
let sampleClassName = reflect(SampleClass.self).summary;
let instance = SampleClass();
let instanceClassName = reflect(instance.dynamicType).summary;
let innerInstance = SampleClass.InnerClass();
let InnerInstanceClassName = reflect(innerInstance.dynamicType).summary.pathExtension;
let tupleArray = [(Int,[String:Int])]();
let tupleArrayTypeName = reflect(tupleArray.dynamicType).summary;

Die Zusammenfassung ist ein Klassenpfad mit beschriebenen generischen Typen. Um einen einfachen Klassennamen aus der Zusammenfassung zu erhalten, probieren Sie diese Methode.

func simpleClassName( complexClassName:String ) -> String {
    var result = complexClassName;
    var range = result.rangeOfString( "<" );
    if ( nil != range ) { result = result.substringToIndex( range!.startIndex ); }
    range = result.rangeOfString( "." );
    if ( nil != range ) { result = result.pathExtension; }
    return result;
}

3voto

DEEPAK KUMAR Punkte 351

Diese Lösung funktioniert für alle Klassen

Swift 5 Lösung:

extension NSObject {
  var className: String {
    return String(describing: type(of: self))
  }

  class var className: String {
    return String(describing: self)
  }
}

VERWENDUNG:

class TextFieldCell: UITableVIewCell {
}

class LoginViewController: UIViewController {
  let cellClassName = TextFieldCell.className
}

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