Ima*_*man 5 if-statement swift
在某些编程语言中,除了简单的||之外还有另外两个运算符 和&&.从现在起我将称之为_orif和_andif的运算符可用于代替&&和|| 它们可能有助于提高效率并避免错误,因为一旦答案明确,有条件的评估就会停止.
例如,下面的表达式的评估将在中途停止(selectedSprite != nil)
为false:因此条件的其余部分将被忽略并且从不进行评估,这将防止在这种情况下发生致命错误:fatal error: unexpectedly found nil while unwrapping an Optional value
并且它会在到达第二个表达式时上升,因为很明显零无响应SpriteOwner()
.
if (selectedSprite != nil) &&
(selectedSprite.SpriteOwner().type == "Human")
{
println("a human selected")
}
Run Code Online (Sandbox Code Playgroud)
我在上面的代码片段中寻找替换的&&代替简单的&&运算符,所以如果第一个表达式被评估为false(具有selectedSprite
等于nil),那么第二个表达式将被忽略(因为它对结果没有任何影响)
是不是有这样的&&?
操作员?如果答案是否定的,
有没有更好的方法来做到这一点而不是像我在这里写的那样的嵌套if语句:
if (selectedSprite != nil)
{
if (selectedSprite.SpriteOwner().type == "Human")
{
println("a human selected")
}
}
Run Code Online (Sandbox Code Playgroud)
我正在实现一个智能系统,其中包含很多if子句,并且大多数都太复杂了,因为添加一个新的if层来控制nil
s是一个真正的噩梦.
您所描述的称为短路,而Swift确实有。例如:
let a : Int? = nil
if a != nil && a! == 1 {
print("a is 1")
} else {
print("a is nil")
}
Run Code Online (Sandbox Code Playgroud)
您可以看到a
它从未解开。我认为就您而言,SpriteOwner()
返回nil 的可能性更大。快速方法包装可选值的方法是使用以下let ... where ...
语法:
if let s = selectedSprite where s.SpriteOwner().type == "Human" {
println("a human selected")
}
Run Code Online (Sandbox Code Playgroud)
小智 5
Swift 2中的二进制逻辑||
和&&
运算符已经按照您的描述运行.请参阅"逻辑AND运算符"下的"Swift编程语言":https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097-CH6-ID60
如果任一值为false,则整个表达式也将为false.实际上,如果第一个值为false,则甚至不会计算第二个值,因为它不可能使整个表达式等于true.这被称为短路评估.
尝试在操场上执行以下操作; 你会看到条件语句的第二部分永远不会被执行,因为第一部分是假的:
func isBar(rv: Bool) -> Bool {
print("side effect of isBar")
return rv
}
func isFoo() -> Bool {
print("side effect of isFoo")
return true
}
if isBar(false) && isFoo() {
print("both true")
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1183 次 |
最近记录: |