一旦答案明确,Swift中是否有一个运算符停止对多表达式条件语句的求值?

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层来控制nils是一个真正的噩梦.

Cod*_*ent 6

您所描述的称为短路,而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)