与swift

时间:2017-09-26 01:29:01

标签: ios swift return

我对Swift中的return感到困惑。我理解它曾用于返回函数中的值,如果这样使用:

func double(value: int) -> Int { 
    return value * 2
}

但我经常只看到return被使用,就像在guard语句中的可选绑定一样:

guard let value = value else (
    print ("nothing")
    return
}

那么在这样的return语句中只有guard的目的是什么?实际上,我经常在解开可选值时在guard语句中看到这一点。当我想使用字典中的可选字符串时,我总是在编写代码时发现这个问题。

let info = ["name": "sarah", "hometown": "sydney"]

class UserInfo {

    func getTheName() -> String {
        guard let name = info["name"] else { return }

        return name
    }
}
// Compile time error: "Non-void function should return a value"

即使我写了return name,我也会收到此错误。 Xcode仍抱怨我没有返回值。是因为return声明中的guard吗?

那么,您能告诉我Swift中return的目的吗?这对我来说很困惑。

2 个答案:

答案 0 :(得分:8)

没有任何参数的

Void会返回returnreturn语句的这种形式只能与返回guard的函数一起使用。

执行return name语句后,函数退出,函数中不再执行任何代码。由于String语句中有return,因此第二个guard将不会被执行(因为它没有返回的名称,所以无法执行),这是为什么会出现编译错误;编译器会查看函数可以返回的所有路径,并确保所有这些路径都返回函数签名所说的内容。

您的问题中的函数指出它返回Void,因此您不能简单地在Void语句中说func getTheName () -> String { guard let name = info["name"] else { return "" } return name } ,因为它返回return info["name"] ?? "",违反了合同表示的合同。

您可以返回不是return的默认值:

Void

使用 nil-coalescing运算符可以更简洁地编写; Void

您还可以在返回func maybePrint(theMessage: String?) -> Void { guard let msg = theMessage else { return } print(msg) } 的函数中使用{{1}}(或者没有明确的返回类型,在这种情况下隐含地理解为返回{{1}})

所以你可以有这样的功能:

{{1}}

答案 1 :(得分:0)

你走在正确的轨道上。

在getTheName()内的guard语句中,如果防护失败,'return'关键字将尝试退出函数本身。但是该函数要求您返回一个String,因此您会收到编译器错误。

以下是对类似问题的另一个SO答案的一部分:

  

guard会强制您使用控制转移语句退出范围。   有4种可用:

     

返回并抛出退出函数/方法继续可以使用   在循环内(而/ for / repeat-while)可以在循环中使用break   (while / for / repeat-while)退出直接范围。指定一个   要打破的标签将允许您一次退出多个范围(例如   打破嵌套循环结构)。使用标签时,休息可以   也适用于范围。此外,您可以退出范围   调用返回Never的函数,例如fatalError。

Stack Overflow: If the Swift 'guard' statement must exit scope, what is the definition of scope?