Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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
Swift 可选择是否使用展开包装?迅速地_Swift_Optional - Fatal编程技术网

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
和可选绑定安全检查和展开选项的建议。