为什么我们需要为Swift中的类编写初始化器,而不是为Struct编写初始化器

时间:2016-12-13 09:39:05

标签: ios swift

Swift为struct类型提供成员初始化程序。但是当谈到class时,我们需要自己明确提供init()。我试图理解这样一个决定背后的逻辑。

样品,

struct SomeStruct {
    var someVar:Int
}
// Memberwise Initializers
let structInstance = SomeStruct(someVar:0)

class SomeClass {
    var someVar:Int
}

let classInstance = SomeClass()

~~> ERROR在第11行,第21行:' SomeClass'无法构造,因为它没有可访问的初始值设定项     let classInstance = SomeClass()

2 个答案:

答案 0 :(得分:5)

它背后的逻辑可能是因为string date = "2016111"; 不是子类,显然需要一个完整的初始化器,因此它是由语言隐含的。

另一方面,struct是可子类化的,因此您可能希望将其设计为只能从子类初始化,因此语言不提供隐式初始化程序。 / p>

答案 1 :(得分:2)

(如下面的@Cœur所指出的,这并没有真正回答这个问题,但可能会为它带来价值,所以我会把它留下来)

来自The Language Guide - Classes and Structures [强调我的]:

  

定义语法

     

以下是结构定义和类定义的示例:

struct Resolution {
    var width = 0
    var height = 0
}
// ...
     

...

     

结构类型的成员初始化程序

     

所有结构都有一个自动生成的成员初始值设定项,   您可以使用它来初始化新结构的成员属性   实例。新实例的属性的初始值可以   按名称传递给成员初始值设定项:

let vga = Resolution(width: 640, height: 480) 
     

与结构不同,类   实例不会收到默认的成员初始化程序

     

...

另外值得一提的是,只有结构化没有定义任何自己的自定义初始化器,才能使用这些;来自Language Guide - Initialization

  

结构类型的成员初始化程序

     

结构类型会自动接收成员初始值设定项(如果它们)   不要定义任何自己的自定义初始值设定项。与默认值不同   初始化程序,即使结构接收成员初始化程序   它存储了没有默认值的属性。

     

...