Swift 2

时间:2015-09-29 18:11:07

标签: ios swift swift2 initializer

在讨论可用的初始化程序时,Apple的Swift编程语言教程指出,与类值不同,对于类,可以在所有存储属性初始化为默认值之后对nil进行可用的初始化程序检查。然后,它继续建议将存储的属性定义为"隐式解包的选项"因为这种定义默认情况下会将存储的属性设置为nil,并且满足上述类的可用初始值设定项的要求。接下来,它提供了以下示例来说明如何应用此隐式解包的可选事项:

示例摘自教程(2015-9-16版)

class Product {
    let name: String!
    init?(name: String) {
        self.name = name
        if name.isEmpty { return nil }
    }
}

对我而言,文本中解释的内容与此示例所示的内容之间存在逻辑上的不一致。在我的拙见中,如果我们要理解如何将name属性定义为String!使得可用的初始化程序能够在初始化的最初阶段失败 - 通过满足类{'将所有存储属性设置为默认值的要求 - 然后我希望init?正文中两个语句的顺序互换如下:

init?(name: String) {
    if name.isEmpty { return nil }
    self.name = name
}

只有在那之后,我们才会理解name属性(定义为String!)在初始化开始时已经有一个默认值(nil)并且允许它如果将其设置为空字符串则失败。

此外,我尝试在操场上交换这些语句的顺序以查看效果,我得到一个错误,说明"所有存储的属性都应该被初始化......等等#34;。

请你澄清一下这里发生了什么?

提前致谢...

修改

我不认为这篇文章是重复的。我已经仔细阅读了这篇文章,你建议回答这个问题。

具体来说,我认为穆斯塔法的回答并不能解释我的要求。他回答了问题"为什么我们需要初始化一个实例的所有存储属性,该属性即将通过其可用的初始化器返回nil#34;。我承认这是由于编译器的限制:目前,编译器无法在必要时销毁部分初始化的类实例。因此,他们试图避免可能发生此类情况的条件。因此,他们建议在示例中将name属性定义为String!。为什么?因为,该定义会将name属性默认为nil。因此,即使我在尝试将其分配给空字符串之前没有为该属性分配任何值,因此可用的初始值设定项将失败,因为它会将name属性设置为有效值,即{ {1}}。

但是,我所说的是,他们的建议没有提供他们的目标。为什么我仍然会得到"未初始化的存储属性的错误"如果我在nil检查后写下self.name = name语句?如果该建议有效,那么这不会返回任何错误。我在这里想念一下吗?

希望,我的问题现在有点清楚了。 感谢...

0 个答案:

没有答案