为什么可用的init需要设置所有变量?

时间:2014-12-11 17:24:34

标签: swift

在具有可用初始化程序的类中,必须在返回nil之前设置所有变量。

这是Swift编程语言指南的近似副本:

class Product {
    let name: String // The guide has this as String! so it can compile
    init?(name: String) {
        if name.isEmpty { return nil }
        self.name = name
    }
}

指南告诉我们name需要String!,而且上述情况不够编译。

我们已经告知"但是,对于类,只有在该类引入的所有存储属性都设置为初始值并且已经发生任何初始化程序委派之后,可用的初始化程序才会触发初始化失败。 "但该指南并未解释允许值类型跳过设置所有变量的原因,而引用类型必须这样做。

我的问题是为什么是初始化所有变量所需的类?

2 个答案:

答案 0 :(得分:1)

关键位(强调添加):

  

...只有在该类引入的所有存储属性都设置为初始值 之后才会进行任何初始化程序委派

初始化链接要求链中的每个初始化程序在委托之前完成其部分作业(无论是从便捷初始化程序到同一类中的指定初始化程序,还是从子类到超类)。如果在设置您负责的状态之前委托另一个初始化程序,则另一个初始化程序会获得一个部分初始化的对象,Swift不允许这样做。 (另一个初始化者无法知道你的注定会失败。)

即使在您的情况下,如果没有超类并且您没有在同一个类中委派,则该规则仍然适用。 (从某种意义上说,你有一个不可见的超类,它的初始化程序被隐式委托给。)

答案 1 :(得分:1)

现在修复了Swift 2.2

我们现在可以使用可用的初始值设定项并在设置所有属性之前返回nil。

enter image description here