Какое действие происходит в этой строке кода?

swift
xcode

#1

Есть такой код:

class FirstViewController: UIViewController, someDelegate{
...
 let storyboard = UIStoryboard(name: "SecondStoryboard", bundle: nil) 
 let someProperty = sb.instantiateInitialViewController() as! SecondViewController          
 someProperty.delegate = self
...
}

Подскажите, пожалуйста, что происходит в этой строке кода:

let someProperty = sb.instantiateInitialViewController() as! SecondViewController

Просьба вынести за скобки тему нахождения другой Storyboard, нахождения её instantiateInitialViewController() и его кастинга до SecondViewController. Это все понятно, вопрос в другом. Если предположим представить эту же строку упрощенно, то она может выглядеть так:

let someProperty = … SecondViewController

Если говорить о базовых операциях, то какая из них здесь осуществляется?

  1. Это непохоже на создание экземпляра объекта, потому что при создании экземпляра у типа объекта должны быть круглые скобки, плюс иногда инициализатор(ы).
  2. Является ли это копированием объекта, класса SecondViewController в константу someProperty?
  3. Можно ли сказать, что в данном случае объект, класс SecondViewController присваивается в константу?

Или это еще какая-то операция?
Т.е., смысл вопроса в том, что каким образом эта константа получает доступ к классу SecondViewController и может выполнять действия по изменению значений свойств в этом классе?


#2

Если предположить что sb это storyboard, тогда вторая строка достает viewController из сториборда, который отмечен как initialViewController. Таким образом можно без помощи сигвеев перейти на данный viewController. Но без перехода на него, делегат работать в этом случае не будет.
Если честно это не стандартный способ работы, обычно такое делается через сигвей.


#3

Спасибо за ответ! Да, действительно это сторибоард. Я согласен с вами, что лучше использовать сигвей, но здесь такая ситуация, что его сложно использовать, потому как нужен переход из одного навигационного стека в другой и придется переходить через TabBar Controller.

По ходу уже сам понял, что в упомянутой строке кода все-таки происходит создание экземпляра.

let someProperty = sb.instantiateInitialViewController()…

который затем кастится до более конкретного SecondViewController

… as! SecondViewController

Но вопросы все равно остаются:

  1. Почему можно создать экземпляр опосредовано?

let someProperty = sb.instantiateInitialViewController() as! SecondViewController

но нельзя напрямую? Например:

let someProperty = SecondViewController()

  1. Каким образом экземпляр может влиять на тип, из которого он создан? Ведь, по идее это отдельная сущность. А здесь, получается, мы создали экземпляр и в нем меняем значение свойства, которое затем отображается в классе. Т.е., одна отдельная сущность меняет значение в другой отдельной сущности. Как это возможно?