2016-09-23 63 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