2017-01-21 33 views
-4

有区别吗?和deinit的效果?在swift中使用了什么“init”?

结构标记{ 变种标记的: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是用于在创建时创建structclass类型的属性的初始值,然后可以调用其他任何方法,然后将其作为参数传递给其他函数或方法。

在Swift中,在返回init之前,必须使用初始值设置任何非可选属性。属性可能已经用初始值声明,这使得它们不必在init方法中设置。

  • class类型必须有一个init方法来实现,如果有尚未与初始值声明的非可选属性。

  • 仅对于struct类型,Swift将自动生成一个init方法,其中每个非可选属性的参数尚未声明为初始值。您可以选择为结构创建任意数量的init方法,只要每个方法返回时,所有非可选属性都有一个值。

  • 在您的例子,有在第二行上创建的init方法,以及提供一种用于该struct类型由夫特自动创建init方法之间没有差别。但是,您可以创建替代初始值设定项,例如,取Double而不是Int,然后在设置mark属性之前将其内部转换。

我认为,实现关键的一点是,即使你不指定init方法自己,一个依然存在,如斯威夫特struct类型自动创建。因此,在您的示例的第一行和第二行中,正在调用init方法(并且它们基本上是相同的实现)。唯一的区别是在第二行写了init实现,Swift编译器在第一行写入init方法。

deinit只存在class类型,它们通过引用传递并具有内存管理。您在创建的class上声明的任何deinit方法将在没有更多对class的实例的引用时调用,并且它将从内存中释放。它被用来从各种观察模式注销或在实例被销毁之前以其他方式清理。

相关问题