在快速闭包中返回Void和()之间的区别

时间:2014-12-11 12:04:35

标签: ios swift

这些关闭之间的区别是什么?

let closureA: () -> ()

let closureB: () -> Void

4 个答案:

答案 0 :(得分:19)

如果查看标题,您会看到Void是(),

的类型
/// The empty tuple type.
///
/// This is the default return type of functions for which no explicit
/// return type is specified.
typealias Void = ()

你可以使用这样的游乐场验证,

let a  = Void()
println(a) // prints  ()

<强>更新

如果您希望在头文件中看到Void的声明,请在上面的代码中,在swift playground或xcode编辑器中输入以下代码,如下所示,

  let a: Void  =  ()

然后,cmd +点击上面表达式中的“Void”关键字,您将进入头文件,您可以在其中实际看到Void的声明。

该文档已更新,其中包含更多信息,

/// The return type of functions that don't explicitly specify a return type;
/// an empty tuple (i.e., `()`).
///
/// When declaring a function or method, you don't need to specify a return
/// type if no value will be returned. However, the type of a function,
/// method, or closure always includes a return type, which is `Void` if
/// otherwise unspecified.
///
/// Use `Void` or an empty tuple as the return type when declaring a
/// closure, function, or method that doesn't return a value.
///
///     // No return type declared:
///     func logMessage(_ s: String) {
///         print("Message: \(s)")
///     }
///
///     let logger: (String) -> Void = logMessage
///     logger("This is a void function")
///     // Prints "Message: This is a void function"
public typealias Void = ()

答案 1 :(得分:2)

完全没有区别

Void是()的别名:

typealias Void = ()

答案 2 :(得分:2)

相同。它只是一个类型,所以它的工作方式完全相同。

typealias Void = ()

听起来像Erica Sadun和Apple正试图坚持使用Void: http://ericasadun.com/2015/05/11/swift-vs-void/

答案 3 :(得分:1)

如果您是因为遇到诸如Cannot convert value of type 'Void.Type' to specified type 'Void'之类的错误而到达这里的,那么考虑一下可能会很有用:

()可能有两件事:

  1. ()可以是一种类型-空元组类型,它与Void相同。
  2. ()可以是一个值-一个空的元组,它与Void()相同。

在我的情况下,我希望将()更改为Void,但这会导致上述错误。解决它要么意味着仅将其保留为(),要么使用Void()。后者可以放在全局常量let void = Void()中,然后可以只使用void。这是否是一种好的做法/风格,尚待争论。