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

Posted

技术标签:

【中文标题】如何将带有类名的字符串转换为类类型本身?【英文标题】:How to convert a string with the name of a class to the class type itself? 【发布时间】:2017-02-01 18:18:15 【问题描述】:

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

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

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

我该怎么做?

【问题讨论】:

您要创建该类型的实例吗?鉴于不同类型的不同初始化程序要求,我不确定这将如何工作。好奇是否有人知道这样做的方法。 【参考方案1】:

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

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

【讨论】:

确实,模块名称是缺少的部分!【参考方案2】:

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

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 方法打印出模块名和类名。然后,您必须使用该字符串才能将其转换回其各自的对象类型。

【讨论】:

但是从字符串到 NSObject.Type 的转换怎么样? self.classForCoder 是一个不错的选择。我不知道从字符串到类类型的转换需要模块名称。我接受了另一个答案,因为它是在这个答案之前发布的。但我真的认为这个答案很有用,感谢您的帮助。【参考方案3】:

可能是这样的:

let objectType: NSObject.Type = NSObject.self 

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

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

【讨论】:

在我的编辑中,我试图指出ObjectNSObject 的子类。如果str 包含“Object”的类名,那么NSClassFromString(str) 仍然是nil,不幸的是。 @pflous 这也适用于纯 swift 类吗?

以上是关于如何将带有类名的字符串转换为类类型本身?的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有 POLYGON 的字符串类型转换为地理类型 - BigQuery

Python爬虫编程思想(79): 将JSON字符串转换为类实例

Python爬虫编程思想(79): 将JSON字符串转换为类实例

如何将字符串转换为类名[重复]

Angular 5 / Typescript - 如何将复杂的 json 对象转换为类

C++类型转换函数