Расширение 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
как возвращаемое значение)
Благодарю.