Рассмотрим базовый класс UIViewController ...Возврат подкласс UIViewController в статическом
class Rooms: UIViewController {
class func instantiate()->Rooms {
}
static func make()->Rooms {
let emplacedAndSetup = self.instantiate()
// various kodes here
// very likely put s.view somewhere
return emplacedAndSetup
}
sundryOtherFunctionality()
}
(Обратите внимание на self.
до того instantiate()
, который, как представляется, необходимо получить «что» cоздателем экземпляров.)
Каждый подкласс знает свой раскадровки идентификатор, как использовать для instantiateViewController
:
class Dining: Rooms {
override class func instantiate()->Dining { // returns a "Dining"
let d = stbd.instantiateViewController(
withIdentifier: "Some Specific Scene") as! Dining
return d
}
}
class Bath: Rooms {
override class func instantiate()->Bath { // returns a "Bath"
let b = stbd.instantiateViewController(
withIdentifier: "Some Other Scene") as! Bath
return b
}
}
Вы можете сделать это,
let d = Dining.make()
let r = Bath.make()
Единственная незначительная проблема в том, что она возвращает базовый класс. НО ВИДЕТЬ НИЖЕ. Так на практике вы должны
let d = Dining.make() as! Dining
let r = Bath.make() as! Bath
Есть ли способ, чтобы изменить статический make
так, что на самом деле Dining.make()
возвратит Dining
и Bath.make()
возвратит Bath
?
(@Hamish отметил, что можно было бы использовать init
и Self
шаблон, Method that returns object of type which was called from Однако, я думаю, что это не представляется возможным из-за instantiateViewController
.)
Зв Скажем, у вас есть такой код, как
let d = Dining.make(blah blah)
на самом деле. Во время выполнения d становится «обеденным», а не «комнатой»
это фантастика.
Но. Если вы сделаете это в IDE
let d:Dining = Dining.make(blah blah)
он не - он думает, что d собирается быть комната, не Dining.
Так весь ваш код должен выглядеть следующим образом:
let d = Dining.make(blah blah) as! Dining
который сосет. Как исправить?
Примечание только TBC решение сделать статический родовым, а также в ответ MartinR здесь https://stackoverflow.com/a/33200426/294884 Пример кода в ответ ниже.
Вы можете использовать инициализатор 'required' вместо статического метода' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', см., например, [этот вопрос и ответы] (http://stackoverflow.com/q/38621563/2976878). – Hamish
Хм, я понимаю @Hamish, я слишком упростил код примера - это контроллер представлений, который становится на лету. Редактирование .. – Fattie
Похоже, вы в основном [просто хотите это] (http://stackoverflow.com/q/33200035/2976878) без параметров для метода 'instantiateFromStoryboard', как вы сами определяете их. – Hamish