如何在swift中使用可选绑定?

Nik*_*iou 13 swift

在swift中,允许以下语法进行流控制

if let constantName = someOptional {
    statements
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,真值背景的语义是什么

是否允许表达链(如下所示)?

if let constantName = someOptional &&  constantName2 = someOptional2 {
    statements
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,布尔表达式是否短路?

Das*_*ash 22

首先someOptional检查它是否为零或有数据.如果它为零,那么if语句就不会被执行.如果有数据,则数据将被解包并分配给constantNameif语句的范围.然后执行大括号内的代码.

if let constantName = someOptional {
    statements
}
Run Code Online (Sandbox Code Playgroud)

没有办法在一个if语句中链接此功能.let constantName = someOptional不直接评估为布尔值.最好将"if let"视为特殊关键字.


Van*_*ran 18

Swift 1.22.1中,您可以这样做:

if let constantName = someOptional, constantName2 = someOptional2 {
    // statements
}
Run Code Online (Sandbox Code Playgroud)


Gor*_*ium 8

不能像这样链接可选的绑定:

if let constantName = someOptional && constantName = someOptional2 {}

但是在Swift 1.2中你可以这样写:

if let constantName = someOptional, constantName = someOptional2 {}

这里发生了什么?

Optionals是他们自己的类型,是Swift提供编译时检查的方式nil.当您键入时,var potentialValue : Int?您没有使用某些特殊的Int,您使用的是Optional类型,它实际上是一个空枚举.这就是为什么你经常需要打开可选项,!因为这允许你访问里面的内容(如果里面有任何东西).如果可选项不包含任何值(即枚举为空),则其值为None.如果optional不是空的,那么它的值Some和您使用的任何类型的关联值 - 所以在这种情况下是Int.

这个:

if (someOptional != nil){
    let constantName = someOptional!
}
Run Code Online (Sandbox Code Playgroud)

与使用此相同:

if let constantName = someOptional {}
Run Code Online (Sandbox Code Playgroud)

这被称为可选绑定.你会注意到这里的第二个版本更具可读性,你不必使用它来显式展开可选项!.

当可选项的值为Some和不是时,它的计算结果为true None- 换句话说,当optional的值不为nil时.(请注意,您仍然可以检查nil是否喜欢,也可以None通过写入更改可选的值someOptional = nil.

还没有提到的其他内容是你可以使用??(称为nil coalescing运算符)来提供一个可选的默认值(如果它没有).例如:

let constantName = someOptional ?? 100
Run Code Online (Sandbox Code Playgroud)

someOptional如果它有一个值,这里将被解包,但如果它没有,那么将100使用该值.

我发现有用的是记住选项是Swift中自己的类型.它们不是您所说的类型的精美版本.

  • ```你会注意到这里的第二个版本更具可读性```。我很抱歉不同意。第一个版本更具可读性,但第二个版本更简洁。简洁并不总是更具可读性 (2认同)