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;
}
}