Swift 可选择是否使用展开包装?迅速地
我在一个类中有一个实例变量,它可能没有值,因此它被定义为可选变量:Swift 可选择是否使用展开包装?迅速地,swift,optional,Swift,Optional,我在一个类中有一个实例变量,它可能没有值,因此它被定义为可选变量: var myObject: MyClass? 在viewDidLoad()方法中,我检查myObject是否有值,如果有,则使用值。但是,Xcode会自动更正代码,以使用?打开可选的,而不是 if myObject != nil { print(myObject?.propertyOne) print(myObject?.propertyTwo) } 我不明白为什么会这样,因为我认为您需要使用以展开可选项,而?定义了
var myObject: MyClass?
在viewDidLoad()
方法中,我检查myObject
是否有值,如果有,则使用值。但是,Xcode会自动更正代码,以使用?
打开可选的,而不是代码>
if myObject != nil {
print(myObject?.propertyOne)
print(myObject?.propertyTwo)
}
我不明白为什么会这样,因为我认为您需要使用
以展开可选项,而?
定义了可选项。使事情更加混乱的是代码>也可以工作:
if myObject != nil {
print(myObject!.propertyOne)
print(myObject!.propertyTwo)
}
感谢您的帮助。测试可选的nil
与测试任何其他值不同。我想这就是造成你困惑的原因
例如,如果您有myObject:MyClass?
,则可以执行以下操作
if myObject != nil {
// Still have to unwrap myObject to use it, cause it's still an optional.
// But at least you knowat this point that force unwrapping of myObject
// won't fail at runtime.
}
但你做不到
if myObject != aNonNilValue {
}
--你需要打开包装才能做后者
关于您的代码示例,使用Swift 2语法执行相同操作的更现代的方法是:
if let myObject = myObject
{
// myObject is not an optional in this scope, so no unwrapping needed!
print(myObject.propertyOne)
print(myObject.propertyTwo)
}
else
{
print("oops, myObject is nil!")
}
一开始这看起来可能有点混乱<赋值左侧的code>myObject
是一个新变量,它保存原始myObject
的未包装值,它不必与从中获取值的可选变量同名。如果原始myObject
为nil,则If let
将不会执行,并且它下面的块也不会运行
使用上面的if let
方法有助于避免运行时错误,因为它可以避免潜在的危险强制展开操作。测试可选的nil
不同于测试任何其他值。我想这就是造成你困惑的原因
例如,如果您有myObject:MyClass?
,则可以执行以下操作
if myObject != nil {
// Still have to unwrap myObject to use it, cause it's still an optional.
// But at least you knowat this point that force unwrapping of myObject
// won't fail at runtime.
}
但你做不到
if myObject != aNonNilValue {
}
--你需要打开包装才能做后者
关于您的代码示例,使用Swift 2语法执行相同操作的更现代的方法是:
if let myObject = myObject
{
// myObject is not an optional in this scope, so no unwrapping needed!
print(myObject.propertyOne)
print(myObject.propertyTwo)
}
else
{
print("oops, myObject is nil!")
}
一开始这看起来可能有点混乱<赋值左侧的code>myObject
是一个新变量,它保存原始myObject
的未包装值,它不必与从中获取值的可选变量同名。如果原始myObject
为nil,则If let
将不会执行,并且它下面的块也不会运行
使用上面的
if let
方法有助于避免运行时错误,因为它可以避免潜在的危险强制展开操作。中使用问号的方式
myObject?.propertyOne
称为可选链接。看
该表达式的值是属性的值,如果myObject
不是nil
,则为nil
。(我应该补充,该表达式的类型是T?
,其中T
是propertyOne
的类型)
这个!操作符是一个力展开。如果myObject
为零,它将使程序崩溃。
从文件中:
尝试使用!访问不存在的可选值会触发运行时错误。在使用之前,请始终确保可选项包含非nil值!强制展开其值
您还可以使用@Macondo2Seattle指出的let
安全地打开您的选项。您在中使用问号的方式
myObject?.propertyOne
称为可选链接。看
该表达式的值是属性的值,如果myObject
不是nil
,则为nil
。(我应该补充,该表达式的类型是T?
,其中T
是propertyOne
的类型)
这个!操作符是一个力展开。如果myObject
为零,它将使程序崩溃。
从文件中:
尝试使用!访问不存在的可选值会触发运行时错误。在使用之前,请始终确保可选项包含非nil值!强制展开其值
您也可以使用let
安全地打开选项,正如@Macondo2Seattle指出的那样。“但是如果myObject!=anNNILVALUE{
“–你可以,只要包装的值是相等的
。有=
和!=
的实现,用于包含相等内容的选项。@AirspeedVelocity--我不知道,很有趣!谢谢你的评论。谢谢你的全面回复。我理解可选绑定的用法,但是没有考虑将它们与可选链接结合使用(如下面的迈克韦尔奇建议的那样)。在你的两个回答之间,我现在有了更好的理解,所以再次感谢:“但是如果MyObjor!你不能做<代码>。ANNNILVALUE{}
“–您可以,只要包装的值是相等的
。有==
和的实现=
用于包含相等内容的选项。@AirspeedVelocity——我不知道,很有趣!谢谢你的评论。谢谢你的全面回复。我理解了可选绑定的使用,但没有考虑到它们与可选链接的结合使用(如下面的@迈克韦尔奇建议)。在您的两个回答中,我现在有了更好的理解,再次感谢:)谢谢,我对声明中使用的?
感到有点困惑,您对可选链接的澄清使事情更加清楚,结合@Macondo2Seattle关于使用let
和可选绑定来安全检查和展开选项的建议。谢谢,我对声明中使用?
感到有点困惑,您对可选链接的澄清让事情变得更清楚了,结合@Macondo2Seattle关于使用let
和可选绑定安全检查和展开选项的建议。