2017-01-21 2 views
-4

Есть ли разница? И эффект деинита?Что такое «init» для swift?

структура знака { вар марка: Int }

структура знака { вар марка: Int INIT (марка: Int) { self.mark = метка }}

+4

Я настоятельно рекомендую вам прочитать раздел [раздел инициализации руководства по языку] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html) (In в частности, бит «Инициализаторы по умолчанию для типов структуры»). – Hamish

ответ

3

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

В Swift любые необязательные свойства должны быть заданы с начальными значениями до возврата init. Свойства могут быть объявлены с начальными значениями уже, что исключает их необходимость устанавливать в методе init.

  • class типы должны иметь init метод реализован, если есть какие-либо неопциональные свойства уже не объявленные с начальными значениями.

  • Только для struct типов Swift автоматически генерирует метод init с параметрами для каждого нефакульного свойства, которое еще не было объявлено с начальным значением. Вы можете произвольно создать любое количество альтернативных методов init для структуры, если к тому времени, когда каждый возвращается, все необязательные свойства имеют значение.

  • В вашем примере, нет никакой разницы между init метода, созданного на второй линии, и автоматически создается init способом, предусмотренным для этого struct типа Свифт. Но вы можете создать альтернативные инициализаторы, которые, например, возьмут Double вместо Int и затем преобразуют его внутренне, прежде чем устанавливать свойство mark.

Я считаю, что ключевым моментом, чтобы понять, что даже если вы не указываете init методу себя, один по-прежнему существует, так как создается автоматически Swift для struct типов. Таким образом, в обеих строках одна и вторая строка вашего примера вызывается метод init (и они по сути являются идентичными реализациями). Единственное различие заключается в том, что вы выполнили реализацию init во второй строке, а компилятор Swift записывает метод init в первой строке.

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

Смежные вопросы