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

时间:2014-06-09 20:53:43

标签: swift

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

if let constantName = someOptional {
    statements
}

在此上下文中真值背景的语义是什么?

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

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

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

9 个答案:

答案 0 :(得分:20)

检查第一个someOptional以查看它是否为零或有数据。如果它为零,那么if语句就不会被执行。如果有数据,则数据将被解包并分配给constantName以获取if语句的范围。然后执行大括号内的代码。

if let constantName = someOptional {
    statements
}

无法在一个if语句中链接此功能。 let constantName = someOptional不会直接评估为布尔值。最好将“if let”视为特殊关键字。

答案 1 :(得分:18)

Swift 1.2 2.1 中,您可以这样做:

if let constantName = someOptional, constantName2 = someOptional2 {
    // statements
}

答案 2 :(得分:7)

无法链接可选绑定,如下所示:

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

与使用它相同:

if let constantName = someOptional {}

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

当可选项的值为Some而不是None时,它的计算结果为true - 换句话说,当optional的值不为nil时。 (请注意,如果您愿意,仍然可以检查nil,并且您还可以通过撰写None将可选的值更改回someOptional = nil

未提及的其他内容是您可以使用??(称为 nil coalescing operator )来提供可选的默认值(如果它没有)一。例如:

let constantName = someOptional ?? 100

如果someOptional有值,则会解包100但如果没有,则会使用值CheckMilitary

我觉得有必要记住,在Swift中,选项是他们自己的类型。它们不是您所说的类型的精美版本。

答案 3 :(得分:3)

检查第一个someOptional以查看其nil。如果不是,则将constantName分配给展开的someOptional值。如果是nil,则转到else语句。

这意味着,即使someOptional是分配给Bool?的{​​{1}},它仍会进入第一个区块,而不是false

在前15分钟内,else视频对此主题进行了深入探讨!

答案 4 :(得分:1)

可以这样想:可选项只是一个带有相关值的枚举。

enum OptionalValue<T> {
    case None
    case Some(T)
}

当您分配给可选项时,会使用.Some枚举值,并使用您提供的关联值。如果将其指定为nil,则赋值为None,没有关联值。

if let constantName = someOptional {}

枚举上是否为if。如果是.Some,则为常量分配关联值,并执行该块。否则没有任何反应。

答案 5 :(得分:0)

可选绑定

Swift 2

   if let constantName = someOptional, constantName2 = someOptional2 {
                // your statement goes here .....
                print(constantName)
                print(constantName2)
            }

swift 3

if let constantName = someOptional, let constantName2 = someOptional2 {
            // your statement goes here .....
            print(constantName)
            print(constantName2)
        }

答案 6 :(得分:0)

if let constantName = someOptional {
    statements
}

基本上这里发生的是,如果someOptional具有非nil值,则为该if语句的范围指定constantName的someOptional值。

就语义而言,事情发生的顺序是A)someOptional被检查为nil,B)然后它被分配给constantName,然后最终,c)语句被执行。

通常,做这样的事情的价值在于,如果你有一个零值,它会阻止应用程序崩溃。值得注意的是,Swift中的nil与Objective-C不同,因为它比简单的指针更强大。

此外,如果someOptional是一个False的Bool,请注意它仍将执行if-block,因为它不检查true / false,而是检查是否存在值。 False的存在使if-block为真。

答案 7 :(得分:0)

来自Apple Doc

可选绑定

要有条件地将Optional实例的包装值绑定到新变量,请使用其中一个可选的绑定控制结构,包括let,guard let和switch。

if let starPath = imagePaths["star"] {
    print("The star image is at '\(starPath)'")
} else {
    print("Couldn't find the star image")
}

可选链接

要安全地访问包装实例的属性和方法,请使用postfix可选链接运算符(postfix?)。以下示例使用可选链接访问String上的hasSuffix(_ :)方法?实例

        if let isPNG =imagePaths["star"]?.hasSuffix(".png") {
            print("The star image is in PNG format")
        }
        // Prints "The star image is in PNG format"

答案 8 :(得分:0)

可选链接示例:

let object : Int ? = 3

if (object =! nil) { print (object! as Any)

}

if let objOptChaining = object { print(objectChaining)

}

可选绑定示例:

let object : Int ? = 3

if let objOptBinding = object{

// objOptBinding hold the value

} else {

// no value }