Как переменная может быть типом класса? - PullRequest
0 голосов
/ 13 октября 2019

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

var person: person!

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Как переменная может быть типом класса и почему это необходимо, когда вы можете просто создать экземпляр класса?

Очевидно, вы можете просто создать экземпляр класса:

var person = Person(...)   // Note, class names generally begin with uppercase letter

Но учтите следующее:

var person: Person!

Это означает, что person теперь является Необязательным, который может ссылаться на экземпляр Person. И ! указывает на то, что этот необязательный параметр будет неявно развернут, когда вы ссылаетесь на него в своем коде.

Таким образом, вопрос в том, почему вы используете последний (неявно развернутая ссылка, которая еще не установлена), а непервое (просто создание экземпляра Person немедленно). Ответ заключается в том, что вы обычно делаете это, когда переменная person просто не может быть установлена ​​изначально, но будет установлена ​​позже.

Типичным примером будет контроллер представления «детали», который покажет нам подробности оPerson объект, выбранный из контроллера предварительного просмотра. Если этот контроллер подробного представления создается, например, из сцены раскадровки, очевидно, что переменная person еще не установлена, поэтому она должна быть необязательной. Но контроллер представления (или координатор, или кто-то еще) установит ссылку person после того, как будет впервые создан контроллер вида сцены, но до того, как контроллер представления появится на экране. Например, мы могли бы установить person пункта назначения в методе prepare(for:sender:) контроллера представления.

Таким образом, в этом случае мы объявили бы person как Необязательный (чтобы экземпляр контроллера представления мог быть создан, хотя person еще не установлен), но объявляем его неявно развернутым (Person!), потому что мы знаем, что докладчик обязательно установит person до того, как контроллер представления сведений появится на экране.

0 голосов
/ 13 октября 2019

Указанный оператор является объявлением переменной без выражения инициализатора. Обычный формат:

var variable name: type = expression

Двоеточие, за которым следует тип, является аннотацией типа, а выражение, которое следует за знаком равенства, является фактическим выражением инициализации.

var person: Person!

Итак, здесь мыобъявляют переменную с именем person, аннотируемую типом Person, и восклицательный знак помечает ее как неявно развернутый необязательный.

Возможно, существует несколько причин, по которым переменная (класс, структура или какой-либо другой тип)может быть объявлено без инициализации:

Пример - работа с переменными IBOutlet, которые объявлены внутри класса контроллера представления. Эти переменные обычно объявляются как неявно развернутые опции. Когда объект контроллера представления создается впервые, эти переменные еще не инициализированы. Однако они всегда устанавливаются к тому времени, когда вызывается viewDidLoad.

Другая причина может заключаться в том, что с точки зрения логики приложения просто не имеет смысла немедленно создавать экземпляр переменной. Ленивая инициализация является частным случаем этого, когда рассматриваемая переменная автоматически инициализируется в первой точке, где это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...