2014-10-08 5 views
0

Я пытаюсь написать функцию, которая загружает определенный контроллер представления из моего массива string>. Однако я очень быстро борюсь с этой концепцией - я достиг этого в Objective-C.Получить NSClassFromString из массива строк - Swift

static NSString const *const viewControllerClassName[3] = {@"one", @"two", @"three"}; 

.

// get the name of the class of the viewcontroller that will be shown on this page 
const NSString *className = viewControllerClassName[1]; 
Class class = NSClassFromString((NSString *)className); 

UIViewController *controller = [[class alloc] initWithContainer:self]; 

Как достичь этой концепции в Свифт? Как класс не показан в Swift?

ответ

0

То, что вы пытаетесь сделать, относится к типу безопасности. Swift - это тип безопасного языка и не позволяет вам это делать. Возможно, это возможно с использованием некоторых функций времени выполнения ObjC, но это, вероятно, не самый лучший способ. Если вам действительно нужны такие вещи, используйте Swift и Objective-C вместе в одном проекте.

0

Swift в настоящее время не делает многое в направлении отражения и метапрограммирования. Для этого вам придется решить использовать Objective-C. Вы можете захотеть взглянуть на Джоша Smiths Swift Factory: http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/

2

Для NSObject производных классов (например, для просмотра контроллера классов), NSClassFromString() до сих пор работает в Swift (смотрите также различные ответы на Swift language NSClassFromString).

Я добавил условный бросок на типа , чтобы гарантировать, что созданный класс действительно подкласс UIViewController. Как следствие, компилятор «знает» о доступных методах инициализации и что созданный экземпляр является UIViewController.

let viewControllerClassName = [ "one", "two", "three"] 

let className = viewControllerClassName[1] 
if let theClass = NSClassFromString(className) as? UIViewController.Type { 
    let controller = theClass(nibName: nil, bundle: nil) 
    // ... 
} 

Обновление для Swift 3:

if let theClass = NSClassFromString(className) as? UIViewController.Type { 
    let controller = theClass.init(nibName: nil, bundle: nil) 
    // ... 
} 
Смежные вопросы