Решение работает и / или лучше как универсальный "UIViewController auto-instantiator", но это ответ на вопрос как таковой.

отрим базовый класс 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() что кажется необходимым для получения "этого" инстанциатора.)

Каждый подкласс знает свой собственный ID раскадровки, чтобы узнать, как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 шаблон,Метод, который возвращает объект типа, который был вызван из Тем не менее, я думаю, что это невозможно из-заinstantiateViewController, )

Так. Скажем, у вас есть код как

let d = Dining.make(blah blah)

по факту.Во время выполнения d превращается в «Столовую», а не в «Комнату»

это круто.

Но. Если вы делаете это в IDE

let d:Dining = Dining.make(blah blah)

он терпит неудачу - он думает, что это будет Комната,не столовая.

Итак, весь ваш код должен выглядеть так:

let d = Dining.make(blah blah) as! Dining

который отстой. Как исправить?

Заметка просто TBC, решение состоит в том, чтобы сделать статический тип обобщенным, как в ответе MartinR здесьhttps://stackoverflow.com/a/33200426/294884 Пример кода в ответе ниже.

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

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