Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert a string with the name of a class to the class type itself?

In order to store a class name in a log file I converted the description of a class type to a string:

let objectType: NSObject.Type = Object.self
let str = String(describing: objectType)

However, I do not succeed in back conversion of str to a variable of type NSObject.Type to use it in a generic method.

How could I do this?

like image 389
Taco Avatar asked Sep 23 '16 19:09

Taco


2 Answers

You can get your class back from string, but you need to use your project's module name while getting class name. If you don't use your module name then it will return nil because the class name you have referenced earlier is not fully qualified by the module name. You should change the class name string to represent the fully qualified name of your class:

let myClassString = String(MyModule.MyViewController.self)
print(myClassString)
let myClass = NSClassFromString("MyModule.\(myClassString)") as! MyViewController.Type
print(myClass)
like image 170
Santosh Avatar answered Oct 19 '22 07:10

Santosh


I simply created an extension to use on any object:

extension NSObject {

    // Save Name of Object with this method
    func className() -> String {

        return NSStringFromClass(self.classForCoder)

    }

    // Convert String to object Type
    class func objectFromString(string: String) -> AnyObject? {
        return NSClassFromString(string)
    }

}

The method classForCoder prints out the module name with the class name. Then you must that string in order to convert it back to its respective object type.

like image 32
Danny Yassine Avatar answered Oct 19 '22 07:10

Danny Yassine