2016-09-23 38 views
7

Aby zapisać nazwę klasy w pliku dziennika konwertowane opis typu klasy do łańcucha:Jak przekonwertować ciąg znaków z nazwą klasy na sam typ klasy?

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

jednak nie uda się z powrotem konwersji str do zmiennej typu NSObject.Type do używaj go w ogólnej metodzie.

Jak mogę to zrobić?

+0

Chcesz utworzyć instancję typu? Nie jestem pewien, jak to może działać, biorąc pod uwagę różne wymagania inicjatora różnych typów. Ciekawe, jeśli ktoś wie, jak to zrobić. –

Odpowiedz

2

Możesz odzyskać klasę od numeru string, ale podczas uzyskiwania nazwy zajęć musisz użyć nazwy swojego projektu: moduł. Jeśli nie używasz nazwy modułu, zwróci ona nil, ponieważ nazwa klasy, do której wcześniej odwoływałeś się, nie jest w pełni kwalifikowana przez nazwę modułu o nazwie. Powinieneś zmienić łańcuch nazwy klasy, aby reprezentował w pełni kwalifikowaną nazwę twojej klasy:

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

Rzeczywiście, nazwa modułu była brakującą częścią! – Taco

0

Może coś takiego:

let objectType: NSObject.Type = NSObject.self 

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

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

Wynikiem 'NSClassFromString (str)' wydaje się być 'nil' ... – Taco

+0

@Taco dokonał pewnych zmian w oparciu o twoją edycję – pflous

+0

W mojej edycji próbowałem wskazać, że' Object' jest podklasą 'NSObject'. Jeśli 'str' zawiera nazwę klasy 'Object', to' NSClassFromString (str) 'jest nadal' nil', niestety. – Taco

1

ja po prostu stworzył rozszerzenie do wykorzystania na dowolnym obiekcie:

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

} 

Sposób classForCoder wypisuje nazwy modułu z nazwą klasy. Następnie musisz ten ciąg, aby przekonwertować go z powrotem na jego odpowiedni typ obiektu.

+0

Ale co z konwersją z ciągu na NSObject.Type? – Taco

+0

Self.classForCoder jest dobry. Nie wiedziałem, że nazwa modułu była wymagana do konwersji z ciągu na typ klasy. Zaakceptowałem drugą odpowiedź, ponieważ została opublikowana przed tą odpowiedzią. Ale naprawdę myślę, że ta odpowiedź jest przydatna i doceniam twoją pomoc. – Taco