为啥 Swift 类需要 init 而不是 Swift struct

Posted

技术标签:

【中文标题】为啥 Swift 类需要 init 而不是 Swift struct【英文标题】:Why Swift class need init but not Swift struct为什么 Swift 类需要 init 而不是 Swift struct 【发布时间】:2020-11-14 01:00:10 【问题描述】:

下面的代码,一个是Struct,一个是Class。

我想知道为什么我们需要init 作为类而不是结构(尽管我们可以添加一个)?在课堂上需要init,但在结构上更放松,这背后有什么技术原因吗?

struct StructTest 
    private let value: Int


class ClassTest 
    private let value: Int

    init(value: Int) 
        self.value = value
     

【问题讨论】:

这应该回答你的问题:***.com/questions/36036202/… 不错@Cristik。这很好。 【参考方案1】:

结构体仍然有一个初始化器。唯一的区别是在某些情况下编译器会为你合成一个“默认的成员初始化器”。

在这种情况下,它创建了一个签名为private init(value: Int)private 因为你的结构有一个private 字段)

【讨论】:

谢谢@Alexander。我了解 Struct,给出了默认值。但是为什么他们不能也为 Class 做呢?是否有技术原因或哲学原因导致默认成​​员初始化程序不能或不应该为类自动合成? @Elye 我认为这是因为类并没有真正由它们的变量定义。它们不太像“值”,因为它们的身份是由它们的内存地址和公共 API 定义的,这与仅由其成员标识的结构不同。这不是一个很好的理由 IMO,因为结构也可以有私有变量 谢谢@Alexander。听起来更像是一个哲学原因,而不是技术原因。感谢您的解释。我只是想彻底了解其背后的原理。 是的。虽然如果你发现自己经常为类编写成员初始化器,也许你没有充分利用结构体 酷!规则总是先用结构。

以上是关于为啥 Swift 类需要 init 而不是 Swift struct的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 为啥在 AFHTTPSessionManager 中需要 init(coder)?

为啥 Django 应用程序需要 `manage.py` 而不是使用 `__init__ py`?

为啥 Swift 2 偏爱强制解包而不是可选项?

为啥在 python 中使用类方法而不是实例方法

为啥在 Swift 中使用“let”而不是 var?

Swift 4 相机视图,为啥这会在 iPad 而不是 iPhone 上崩溃?