Swift中结构体和类的构造器其实差不多。
除了结构体中没有析构器(Deinitializer),不能够继承(inherit)以及结构体有memberwise构造器外大体上是一致的。
所以你有时候看到一个结构体struct Point
有两个存储属性var x: Double
, var y: Double
,却没有任何构造器,但是他们既不符合类中讨论的第一种初始化方法(即赋默认值)。
那么它们违背了语法规则吗?其实不是的,如果结构体没有自定义的构造器,Swift隐式创建了一个init(x:y:)
的构造器其内容就相当于self.x = x, self.y = y
。如果你手动给结构体加个空内容的构造器init(){ }
,编译器就报Return from initializer without initializing all stored properties
的错误。
也就是说,如果你创建了你自己定义的构造器,Swift就默默地帮你把memberwise构造器去掉了,而你自己定义的构造器又没有对存储属性初始化,那么这违背了语法规则。但是如果你想同时拥有这两个构造器(memberwise构造器和自定义构造器),你可以把自定义的构造写到Extension Point{ // custom initializer }
里面进去。