2014-06-10 20 views
21

在Swift中,如果闭包仅包含单个语句,它将自动返回从该单个语句返回的值。无返回类型的单行关闭

这并不是所有情况下都很自然。让我们来看一个例子:

func StringReturningFunc() -> String { 
    return "Test String" 
} 

// Error: Cannot convert the expressions type '() -> $T0' to type 'String' 
let closure:() ->() = { 
    StringReturningFunc() 
} 

正如你可以看到,即使关闭应该只调用一个简单的函数,它会尝试自动返回它的返回值,这是String类型,不匹配的回报请输入void

我可以通过实现封闭体像这样防止这种情况:

let _ = StringReturningFunc() 

这感觉难以置信的奇怪。

有没有更好的方法来做到这一点,或者这只是我必须忍受的事情?

+5

我觉得这是一个很好的问题。但它可能有助于添加一个“有更好的解决方案吗?”阻挠近距离投票。 –

+1

@CraigOtis编辑我的问题,谢谢你的提示。 – NSAddict

+0

我不明白这一点,你怎么能说你的stringreturningfunc显式返回一个字符串时,返回()返回()? –

回答

23

发生这种情况的原因是单行表达式关闭的简写。您的封闭中有一个隐含的“返回”,因为它被写入。

let closure:() ->() = { 
    StringReturningFunc() 
    return 
} 

写这样说,这应该工作

+2

感谢您的提示!如果OP仍然希望它是单行的,可以用'let wrapped:() - > Void = {stringReturningFunc();返回}' – Erik

+0

我明白了。我认为这种闭合速记不是最好的设计选择。是的,在某些情况下,你不必写'return'(但在这种情况下它有目的),但是在其他情况下你必须(在那些没有目的的情况下)。感谢您的回答! – NSAddict

+2

是否真的没有其他方式来做到这一点,而不必显式调用返回? – Mike

0

这个怎么样...;)

@discardableResult func StringReturningFunc() -> String { 
    return "Test String" 
} 

// Error: Cannot convert the expressions type '() -> $T0' to type 'String' 
let closure:() ->() = { 
    StringReturningFunc() 
}