在讨论可用的初始化程序时,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
语句?如果该建议有效,那么这不会返回任何错误。我在这里想念一下吗?
希望,我的问题现在有点清楚了。 感谢...