Есть ли разница? И эффект деинита?Что такое «init» для swift?
структура знака { вар марка: Int }
структура знака { вар марка: Int INIT (марка: Int) { self.mark = метка }}
Есть ли разница? И эффект деинита?Что такое «init» для swift?
структура знака { вар марка: Int }
структура знака { вар марка: Int INIT (марка: Int) { self.mark = метка }}
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
, и он будет выпущен из памяти. Он используется для снятия регистрации с различных шаблонов наблюдений или очистки других объектов до того, как экземпляр будет уничтожен.
Я настоятельно рекомендую вам прочитать раздел [раздел инициализации руководства по языку] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html) (In в частности, бит «Инициализаторы по умолчанию для типов структуры»). – Hamish