UPDATED TO SWIFT 5
We can get pretty descriptions of type names using the instance variable through the String initializer and create new objects of a certain class
Like, for example print(String(describing: type(of: object))). Where object can be an instance variable like array, a dictionary, an Int, a NSDate, etc.
Because NSObject is the root class of most Objective-C class hierarchies, you could try to make an extension for NSObject to get the class name of every subclass of NSObject. Like this:
extension NSObject { var theClassName: String { return NSStringFromClass(type(of: self)) } }
Or you could make a static funcion whose parameter is of type Any (The protocol to which all types implicitly conform) and returns the class name as String. Like this:
class Utility{ class func classNameAsString(_ obj: Any) -> String { //prints more readable results for dictionaries, arrays, Int, etc return String(describing: type(of: obj)) } }
Now you can do something like this:
class ClassOne : UIViewController{ /* some code here */ } class ClassTwo : ClassOne{ /* some code here */ } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Get the class name as String let dictionary: [String: CGFloat] = [:] let array: [Int] = [] let int = 9 let numFloat: CGFloat = 3.0 let numDouble: Double = 1.0 let classOne = ClassOne() let classTwo: ClassTwo? = ClassTwo() let now = 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("classOne = ClassOne() -> \((ClassOne).self)") //we use the Extension if classTwo != nil { print("classTwo: ClassTwo? = ClassTwo() -> \(Utility.classNameAsString(classTwo!))") //now we can use a Forced-Value Expression and unwrap the value } print("now = Date() -> \(Utility.classNameAsString(now))") print("lbl = UILabel() -> \(String(describing: type(of: lbl)))") // we use the String initializer directly } }
Also, once we can get the class name as String, we can instantiate new objects of that class:
// Instantiate a class from a String print("\nInstantiate a class from a String") let aClassName = classOne.theClassName let aClassType = NSClassFromString(aClassName) as! NSObject.Type let instance = aClassType.init() // we create a new object print(String(cString: class_getName(type(of: instance)))) print(instance.self is ClassOne)
Maybe this helps someone out there!.