2017-09-26 54 views
0

我很快与'return'混淆。我明白,如果它是用来在函数返回值,如果是用这样的事情我了解与swift中的'return'功能混淆

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

,但我经常看到的只是“回报”时,我的意思是在后卫声明类似的可选这样的绑定:

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

那么,在这样的守卫声明中,只是'返回'的目的是什么?其实,我经常不仅看到可选绑定的警戒声明。在编写代码时,当我想使用可选的字符串,从字典

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

class UserInfo { 



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

    return name 
} 


} 
xcode error : non-void function should return a value (even though i 
have written 'return name') 
即使我已经写了“回归名字”

我一直觉得这个问题,但Xcode中仍然认为我还没有返回值。是否因为警戒声明中的“返回”?

那么,您能否告诉我快速返回的目的?这令我感到困惑。

+0

以'guard'声明中,'let'语句作用域块的外面,所以你不能用它的'else'块内。 –

回答

6

return没有任何参数返回Void。这种形式的return声明只能与返回Void的函数一起使用。

执行return语句后,该函数将退出并且您的函数中没有更多代码会执行。由于guard语句中有return,因此第二个return name将不会执行(因为它没有返回名称,所以不会执行它),这就是为什么会出现编译器错误的原因;编译器会查看函数返回的所有路径,并确保所有这些路径返回函数签名所表示的路径。

在你的问题的功能状态,它返回一个String,所以你不能简单地说returnguard语句返回Void,侵犯了您的函数签名表达了合同。

你可以返回一个默认值不是Void

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

这可能更加简洁使用未缴合并运算写的; return info["name"] ?? ""

您还可以使用return在返回Void一个函数(或没有明确的返回类型,在这种情况下,它隐含理解为返回Void

所以,你可以有这样一个功能:

func maybePrint(theMessage: String?) -> Void { 
    guard let msg = theMessage else { 
     return 
    } 
    print(msg) 
} 
+0

'nil'或'Void'都不是“Nothing”。 “无”在Swift中是非常具体的含义,即'Nothing'类型。是正确的,这些函数返回'()'(亦称'Void'的'Void'类型的唯一实例) – Alexander

+0

其实,这是不正确;你需要明确地返回'nil'作为可选;我已经更新了我的答案。谢谢 – Paulw11

0

你在正确的轨道上。

在getTheName()中的guard语句中,如果警卫失败,'return'关键字将尝试退出函数本身。但是该函数需要你返回一个字符串,因此你会得到编译器错误。

这里是另一部分,这样回答过类似的问题:

卫队你使用控制转移语句退出的范围。 有4个供您选择:

回报,扔都退出函数/方法继续可循环内使用 (在/为/重复,同时)破可循环使用 (在/为/重复同时)退出眼前的范围。指定 标签突破将让你一次(例如 打破了嵌套循环结构)退出多个范围。当使用标签时,break可以在范围内使用 。此外,您可以通过调用一个返回从不的函数(如fatalError)退出 。

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