【问题标题】:One-line closure without return type没有返回类型的单行闭包
【发布时间】:2014-06-10 20:37:57
【问题描述】:

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

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

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

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

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

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

let _ = StringReturningFunc()

这感觉非常奇怪。

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

【问题讨论】:

  • 我认为这是一个很好的问题。但添加一个“有更好的解决方案吗?”可能会有所帮助。阻碍票数接近。
  • @CraigOtis 编辑了我的问题,感谢您的提示。
  • 我不明白这个意思,你的stringreturningfunc显式返回一个字符串,你怎么能说闭包返回()?
  • @EdgarAroutiounian 仅仅因为闭包调用stringReturningFunc 并不意味着它也应该返回String。在这里它应该什么都不返回,而不是 String
  • @EdgarAroutiounian 他试图执行函数并丢弃返回,但是在单行闭包上有一个隐含的return 语句。

标签: swift


【解决方案1】:

发生这种情况的原因是单行表达式闭包的简写。写的时候,你的闭包中有一个隐含的“返回”。

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

这样写应该可以的

【讨论】:

  • 感谢您的提示!如果 OP 仍然希望它是单行,则可以使用 let wrapped : () -> Void = { stringReturningFunc(); return }
  • 真的没有其他方法可以不用显式调用return吗?
  • 如果他们刚刚检测到闭包应该返回 Void 并且因此没有尝试返回第一个语句,这不能在 Swift 编译器中修复吗?在所有其他不返回 Void 的闭包中,它可以使用隐式返回。
  • @SandyChapman 在其他语言中,排除“return”只是隐含的“return void”。你只是习惯了那个约定,你可以很容易地习惯这个约定。随着软件开发的不断发展,对 Swift 等新语言重新定义其中一些约定是有好处的。
  • 似乎从 Xcode Beta 版本 6.3 (6D520o) 开始修复。 “单表达式闭包的隐式返回”现在也适用于返回 Void 以外的其他内容的表达式。
【解决方案2】:

这个怎么样... ;)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-23
    • 2021-01-06
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多