有区别吗?和deinit的影响?
struct mark { var mark:Int }
struct mark { var mark:Int init(mark:Int){ self.mark = mark } }
答案 0 :(得分:4)
init
用于在创建struct
或class
类型的属性时为其设置初始值,之后可以在其上调用任何其他方法之前和之前作为参数传递给其他函数或方法。
在Swift中,必须在init
返回之前使用初始值设置任何非可选属性。可以使用初始值声明属性,从而排除它们必须在init方法中设置。
class
类型必须实现init
方法。
仅对于struct
类型,Swift将自动生成一个init
方法,其中包含尚未使用初始值声明的每个非可选属性的参数。您可以选择为结构创建任意数量的替代init
方法,只要每个方法返回时,所有非可选属性都具有值。
在您的示例中,第二行创建的init
方法与Swift为该init
类型提供的自动创建的struct
方法没有区别。但您可以创建备用初始值设定项,例如,使用Double
而不是Int
,然后在设置mark
属性之前将其转换为内部。
我认为要实现的关键点是,即使您没有自己指定init
方法,仍然存在,由Swift自动为struct
类型创建。因此,在您的示例的第一行和第二行中,正在调用init
方法(并且它们本质上是相同的实现)。唯一的区别是你在第二行写了init
实现,而Swift编译器在第一行写了init
方法。
deinit
仅存在于class
类型,它们通过引用传递并具有内存管理。当您创建的deinit
上声明的任何class
方法将在没有对class
的该实例的更多引用时被调用,并且它将从内存中释放。在实例销毁之前,它已用于取消注册各种观察模式或以其他方式进行清理。