如何将具有类名称的字符串转换为类类型本身?

时间:2016-09-23 19:37:56

标签: ios swift generics metaprogramming metaclass

为了在日志文件中存储类名,我将类类型的描述转换为字符串:

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

但是,我没有成功将str反向转换为NSObject.Type类型的变量,以便在通用方法中使用它。

我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

您可以从string返回课程,但在获取课程名称时需要使用项目的模块名称。如果您不使用模块名称,那么它将返回nil,因为您之前引用的类名称未完全由模块名称限定。您应该更改类名称字符串以表示类的完全限定名称:

let myClassString = String(MyModule.MyViewController.self)
print(myClassString)
let myClass = NSClassFromString("MyModule.\(myClassString)") as! MyViewController.Type
print(myClass)

答案 1 :(得分:1)

我只是创建了一个扩展用于任何对象:

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)
    }

}

方法 classForCoder 使用类名打印出模块名称。然后你必须该字符串才能将其转换回各自的对象类型。

答案 2 :(得分:0)

也许是这样的:

let objectType: NSObject.Type = NSObject.self 

let str = String(objectType) // str = "NSObject"

let aClass = NSClassFromString(str) as! NSObject.Type // aClass = NSObject.Type