Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 非可选的存储属性初始化_Ios_Swift_Swift2.2 - Fatal编程技术网

Ios 非可选的存储属性初始化

Ios 非可选的存储属性初始化,ios,swift,swift2.2,Ios,Swift,Swift2.2,我对斯威夫特很陌生。 我从苹果公司找到了以下文档 类和结构必须将其所有存储属性设置为 在该类的实例或 结构被创建。存储的属性不能保留在 不确定状态 您可以为存储的属性设置一个初始值 初始值设定项,或通过将默认属性值指定为 财产的定义。下面将介绍这些操作 部分 但是下面的代码noOfTyres没有初始化,编译器也没有抱怨,请解释一下 class Vehicle { var noOfTyres: Int! var engineCapacity: Int init()

我对斯威夫特很陌生。 我从苹果公司找到了以下文档

类和结构必须将其所有存储属性设置为 在该类的实例或 结构被创建。存储的属性不能保留在 不确定状态

您可以为存储的属性设置一个初始值 初始值设定项,或通过将默认属性值指定为 财产的定义。下面将介绍这些操作 部分

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

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

    init()
    {
        engineCapacity = 10
    }

}

如果将存储的属性设置为可选属性,则可以声明该属性,而无需为其指定初始值。然后该属性要么有值,要么为nil。可选属性可以用

var myOptional : Int?

因此,noOfTyres未初始化,但它是可选的,当前设置为nil

有关更多信息,请阅读


补充资料。不同类型的可选声明(!和?)在中进行了解释。

我不确定这是否是答案

文件上说,

当一个可选项的值在第一次定义该可选项之后立即被确认存在时,隐式展开的可选项是有用的,并且可以肯定地假设该可选项在此后的每一点上都存在

因此,编译器希望它是初始化的,肯定包含一个值。但如果我们在运行时访问它而没有值,它将崩溃


如果使用可选属性作为存储属性,它将具有一个nil值&对于其他存储属性,需要初始化。

在您的情况下,编译器不会抱怨,直到您尝试使用该值。因为您的值是未包装的(!),所以它假定它永远不会为零,并且尝试访问该值将崩溃

在本例中,我将向属性
noOfTyres
添加一个默认值

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

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

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

}
请记住,如果它不是可选的,您的意思是,属性永远不会为零


另一件事,按照惯例,类名必须大写。

noOfTyres
是隐式展开可选的,它只是有一个默认值nil。如果您尝试像
vehicle().noOfTyres+5
这样的操作,您的应用程序会崩溃,因为
noOfTyres
未设置。我浏览了您提到的帖子以及文档,我对它感到困惑“绳子!是一个隐式展开的可选选项,您可以在初始化后指示它始终具有一个值“但在我在问题中发布的代码段中,它也可能未初始化,但如果未指定值,我可能会得到运行时错误。但对于其他存储属性,如果未初始化,编译器将给出错误。这有什么区别?这是真的。”。我认为用隐式unwrapped!声明可选项不是一个好的编码实践!,因为您希望在运行时会有一个值,并且属性不是nil。如果属性为nil,则应用程序将崩溃。使用声明可选属性!将使您的代码更少地保存,这是swift的目标,即编写安全、快速和富有表现力的代码。我希望它能回答你的问题。
class Vehicle
{
    var noOfTyres : Int!
    var engineCapacity :Int

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

}