2016-09-23 38 views
7

为了存储在日志文件中的类名我转换类类型的描述字符串:如何将带有类名的字符串转换为类类型本身?

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

不过,我并不在str回转化为NSObject.Type类型的一个变量成功以通用方法使用它。

我该怎么做?

+0

您想创建类型的实例吗?我不确定在不同类型的初始化器需求不同的情况下,这是如何工作的。好奇,如果有人知道一种方式来做到这一点。 –

回答

2

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

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

确实,模块名称是缺少的部分! – Taco

0

也许是这样的:

let objectType: NSObject.Type = NSObject.self 

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

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

'NSClassFromString(str)'的结果似乎是'nil' ... – Taco

+0

@Taco根据您的编辑做了一些更改 – pflous

+0

在我的编辑中,我试图指出Object是NSObject的一个子类。如果'str'包含'Object'的类名,那么'NSClassFromString(str)'仍然是'nil',不幸的是。 – Taco

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打印出与类名的模块名称。然后,您必须将该字符串转换为其各自的对象类型。

+0

但是如何将字符串转换为NSObject.Type? – Taco

+0

self.classForCoder是一个不错的选择。我不知道模块名称是从字符串转换为类类型所必需的。我接受了这个答案之前发布的其他答案。但我真的认为这个答案很有用,我感谢你的帮助。 – Taco