在swift中,流控制允许以下语法
if let constantName = someOptional {
statements
}
在此上下文中真值背景的语义是什么?
是否允许表达式链接(如下所示)?
if let constantName = someOptional && constantName2 = someOptional2 {
statements
}
如果是这样,布尔表达式是否短路?
答案 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 }