AKTUALISIERT ZU SWIFT 5
Wir können ziemlich aussagekräftige Beschreibungen von Typnamen über die Instanzvariable über den String
-Initialisierer erhalten und neue Objekte einer bestimmten Klasse erstellen
Zum Beispiel print(String(describing: type(of: object)))
. Wo object
eine Instanzvariable wie Array, ein Dictionary, ein Int
, ein NSDate
usw. sein kann.
Weil NSObject
die Wurzelklasse vieler Objective-C Klassenhierarchien ist, könnten Sie versuchen, eine Erweiterung für NSObject
zu erstellen, um den Klassennamen jeder Unterklasse von NSObject
zu erhalten. So:
extension NSObject {
var theClassName: String {
return NSStringFromClass(type(of: self))
}
}
Oder Sie könnten eine statische Funktion erstellen, deren Parameter vom Typ Any
(Das Protokoll, dem alle Typen implizit entsprechen) ist und den Klassennamen als String zurückgibt. So:
class Utility{
class func classNameAsString(_ obj: Any) -> String {
//liefert lesbarere Ergebnisse für Dictionaries, Arrays, Int, usw.
return String(describing: type(of: obj))
}
}
Jetzt können Sie so etwas machen:
class KlasseEins : UIViewController{ /* hier etwas Code */ }
class KlasseZwei : KlasseEins{ /* hier etwas Code */ }
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Den Klassennamen als String erhalten
let dictionary: [String: CGFloat] = [:]
let array: [Int] = []
let int = 9
let numFloat: CGFloat = 3.0
let numDouble: Double = 1.0
let klasseEins = KlasseEins()
let klasseZwei: KlasseZwei? = KlasseZwei()
let jetzt = NSDate()
let lbl = UILabel()
print("dictionary: [String: CGFloat] = [:] -> \(Utility.classNameAsString(dictionary))")
print("array: [Int] = [] -> \(Utility.classNameAsString(array))")
print("int = 9 -> \(Utility.classNameAsString(int))")
print("numFloat: CGFloat = 3.0 -> \(Utility.classNameAsString(numFloat))")
print("numDouble: Double = 1.0 -> \(Utility.classNameAsString(numDouble))")
print("klasseEins = KlasseEins() -> \((KlasseEins).self)") //wir verwenden die Erweiterung
if klasseZwei != nil {
print("klasseZwei: KlasseZwei? = KlasseZwei() -> \(Utility.classNameAsString(klasseZwei!))") //jetzt können wir einen Forced-Value-Ausdruck verwenden und den Wert auspacken
}
print("jetzt = Date() -> \(Utility.classNameAsString(jetzt))")
print("lbl = UILabel() -> \(String(describing: type(of: lbl)))") // wir verwenden den String-Initialisierer direkt
}
}
Außerdem, sobald wir den Klassennamen als String erhalten, können wir neue Objekte dieser Klasse instanziieren:
// Instanziierung einer Klasse aus einem String
print("\nInstanziierung einer Klasse aus einem String")
let einKlassenname = klasseEins.theClassName
let einKlassenTyp = NSClassFromString(einKlassenname) as! NSObject.Type
let instanz = einKlassenTyp.init() // wir erstellen ein neues Objekt
print(String(cString: class_getName(type(of: instanz))))
print(instanz.self is KlasseEins)
Vielleicht hilft dies jemandem da draußen!.