为什么Swift class需要init而不是Swift struct

4nkexdtk  于 11个月前  发布在  Swift
关注(0)|答案(2)|浏览(78)

下面的代码,其中一个用于结构,另一个用于类。
我想知道为什么我们需要init作为class而不是struct(尽管我们可以添加一个)?在类中需要init,但在结构中更宽松,这背后有什么技术原因吗?

struct StructTest {
    private let value: Int
}

class ClassTest {
    private let value: Int

    init(value: Int) {
        self.value = value
    } 
}
eeq64g8w

eeq64g8w1#

结构仍然有初始化器。唯一的区别是,在某些情况下,编译器将为您合成一个“默认的成员方式初始化器”。
在本例中,它创建了一个符号为private init(value: Int)private,因为您的结构体有一个private字段)的字段

c8ib6hqw

c8ib6hqw2#

在Swift中,struct和class都被用来定义自定义类型,但它们在行为上有一些关键的区别。其中一个区别是Swift中的结构默认自动接收一个memberwise初始化器,而类则没有。
这种设计选择背后的原因是结构和类之间的根本区别。Swift中的结构是值类型,这意味着当你创建一个结构的示例并将其赋给变量或作为函数参数传递时,整个值的副本就被创建了。另一方面,类是引用类型,当您使用它们时,实际上是在处理对基础示例的引用。
考虑到这一区别,结构的memberwise初始化器允许您使用单个初始化器轻松地初始化结构的所有属性。由于结构体在赋值或传递时会被复制,因此使用成员式初始化器简化了创建新示例的过程。
类作为引用类型,通常用于更复杂的场景,并且可以具有继承、反初始化器和其他需要更显式初始化逻辑的特性。为类提供默认构造函数需要额外的考虑,并且不会像为结构那样简单。
也就是说,在Swift中,你仍然可以为结构体和类定义自定义初始化器。如果希望类具有默认构造函数,可以通过提供无参数初始化器来定义一个。然而,与结构不同,类不会自动接收成员式初始化器。

相关问题