非可选的存储属性初始化

时间:2016-05-04 13:53:01

标签: ios swift swift2.2

我很快乐。 我从Apple找到了以下文件。

  

类和结构必须将其所有存储属性设置为   适当的初始值,当该类的实例或   结构已创建。存储的属性不能留在   不确定的状态。

     

您可以在其中设置存储属性的初始值   初始化程序,或通过指定默认属性值作为一部分   财产的定义。以下描述了这些操作   部分。

但是下面的代码noOfTyres没有初始化,编译器没有抱怨,请解释一下。

class Vehicle
{
    var noOfTyres: Int!
    var engineCapacity: Int

    init()
    {
        engineCapacity = 10
    }

}

3 个答案:

答案 0 :(得分:1)

如果将此属性设为可选属性,则可以声明存储的属性,而不为其指定初始值。然后该属性有一个值或它是零。可选属性使用

声明
var myOptional : Int?

var myOptional : Int!

因此noOfTyres未初始化,而它是可选的,目前设置为nil。

如需了解更多信息,请阅读Apple documentation

其他信息。 this post中解释了不同类型的可选声明(!和?)。

答案 1 :(得分:1)

在您的情况下,编译器不会抱怨,直到您尝试使用该值。因为你有值un-wrapped(!)它假定它永远不会是nil并且试图访问该值会崩溃。

在这种情况下,我会向属性noOfTyres添加默认值。

var noOfTyres: Int = 2

或者,您可以在构造函数中添加该值,以确保每次创建对象时都必须设置该值。

class Vehicle
{
    var noOfTyres : Int!
    var engineCapacity :Int

    init(noOfTyres: Int)
    {
        self.noOfTyres = noOfTyres
        engineCapacity=10;
    }

}

请记住,如果它不是可选的,那么你说,该财产永远不会是零。

另一方面,按惯例,类名必须大写。

答案 2 :(得分:0)

我不确定,如果这可以成为答案

文档说,

  

如果在首次定义可选项后立即确认可选项的值存在,并且可以假定在此后的每个点都存在,则隐式解包的选项会很有用。

因此它被编译器预期初始化,肯定包含一个值。但是如果我们在运行时没有值访问它就会崩溃

如果使用可选项作为存储属性,则其atlas值为nil值&对于其他存储的属性,需要初始化。