单线闭合,无返回类型

NSA*_*ict 23 swift

在Swift中,如果闭包只保存一个语句,它会自动返回从该单个语句返回的值.

在所有情况下,这都不是很自然.我们来看一个例子:

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

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

正如您所看到的,即使闭包只应调用一个简单的函数,它也会尝试自动返回它的返回值,该值是类型String,并且与返回类型不匹配void.

我可以通过实现这样的闭包体来防止这种情况:

let _ = StringReturningFunc()
Run Code Online (Sandbox Code Playgroud)

这感觉非常奇怪.

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

Jos*_*erg 25

发生这种情况的原因是单行表达式闭包的简写.在写入时,闭包中有一个隐含的"返回".

let closure: () -> () = {
    StringReturningFunc()
    return
}
Run Code Online (Sandbox Code Playgroud)

写它应该工作

  • 如果它们刚刚检测到闭包应该返回Void并且因此没有尝试返回第一个语句,那么这不能在Swift编译器中修复吗?在所有其他不返回Void的闭包中,它可以使用隐式返回. (11认同)
  • 谢谢你的提示!如果OP仍然希望它是单行,则可以使用`let wrapped :() - > Void = {stringReturningFunc(); return}` (2认同)
  • 没有明确调用return,真的没有其他办法吗? (2认同)
  • 似乎从Xcode Beta版本6.3(6D520o)开始修复."单表达式闭包的隐式返回"现在也适用于返回除Void之外的其他内容的表达式. (2认同)