Расширение UIViewController для создания экземпляров из раскадровки

Я пытаюсь написать небольшое расширение в Swift для обработки экземпляровUIViewController из раскадровки.

Моя идея заключается в следующем:UIStoryboardметодinstantiateViewControllerWithIdentifier нужен идентификатор для создания экземпляра контроллера представления данной раскадровки, почему бы не назначить каждому контроллеру представления в моей раскадровке идентификатор, равный его точному имени класса (т.е.UserDetailViewController будет иметь идентификатор «UserDetailViewController») и создать метод класса на UIViewController, который бы:

принятьUIStoryboard экземпляр как уникальный параметрполучить имя текущего класса в виде строкивызовinstantiateViewControllerWithIdentifier на экземпляре раскадровки с именем класса в качестве параметраполучить недавно созданныйUIViewController экземпляр и вернуть его

Таким образом, вместо (который повторяет имя класса в виде строки, не очень приятно)

let vc = self.storyboard?.instantiateViewControllerWithIdentifier("UserDetailViewController") as UserDetailViewController

это было бы:

let vc = UserDetailViewController.instantiateFromStoryboard(self.storyboard!)

Я делал это в Objective-C со следующей категорией:

+ (instancetype)instantiateFromStoryboard:(UIStoryboard *)storyboard
{
    return [storyboard instantiateViewControllerWithIdentifier:NSStringFromClass([self class])];
}

Но я полностью застрял с версией Swift. Я надеюсь, что есть какой-то способ сделать это. Я попробовал следующее:

extension UIViewController {
    class func instantiateFromStoryboard(storyboard: UIStoryboard) -> Self {
        return storyboard.instantiateViewControllerWithIdentifier(NSStringFromClass(Self))
    }
}

возвратеSelf вместоAnyObject позволяет вывод типа работать. В противном случае мне пришлось бы приводить каждый возврат этого метода, что раздражает, но, возможно, у вас есть лучшее решение?

Это дает мне ошибку:Use of unresolved identifier 'Self' NSStringFromClass часть, кажется, проблема.

Как вы думаете?

Есть ли способ вернутьSelf из функций класса?

Как бы вы работали без необходимости каждый раз приводить возвращаемое значение? (т.е. ведение-> Self как возвращаемое значение)

Благодарю.

Ответы на вопрос(10)

Ваш ответ на вопрос