小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
从今天开始我参加程序员必备小知识活动了,考虑活动的持续性和篇幅,我计划每一篇只讲解一个简单的知识点。
因为并没有做太多的准备了,可能内容就会比较混杂大家见谅。
那么开始今天的内容吧。
最熟悉的陌生人Void
如果要让你回想起来写Swift的时候,你什么时候用过Void
这个关键词,可能会是在写闭包的时候,我们来看一个系统API:
open func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil)
我们来看看这个completion
参数的类型——(() -> Void)?
,我们撇开可选类型的干扰,去掉最外层的()和?得到的就是() -> Void
。
我们自己定义一个无参数无返回值的闭包时候,可能会这么写:
var callback: (() -> Void)?
另外还有另一种写法:
var callback: (() -> ())?
你会发现这两种写法是等价的!
为什么?因为源码定义中就是这样定义的:
/// The return type of functions that don't explicitly specify a return type,
/// that is, an empty tuple `()`.
///
/// 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 = ()
我们仔细推敲一下这段注释和例子:
没有明确指定返回类型的函数,那么它的返回类型就是一个空元组`()`。
当声明一个函数(方法)时,如果它没有返回值,你大可不必去特地的声明返回类型。
然而需要注意的是,函数(方法)或者一个闭包总是会有一个返回类型,如果未指定那么就是Void。
所以请使用Void或者空元组去定义一个没有返回值的函数(方法)或者闭包吧。
这个函数:
func logMessage(_ s: String) {
print("Message: \(s)")
}
可以写成以下2种形式:
func logMessage1(_ s: String) -> Void {
print("Message: \(s)")
}
func logMessage2(_ s: String) -> () {
print("Message: \(s)")
}
甚至带上return ()
也没有问题,编译器是不会报错的
func logMessage3(_ s: String) -> Void {
print("Message: \(s)")
return ()
}
func logMessage4(_ s: String) -> () {
print("Message: \(s)")
return ()
}
而它的类型通过这段代码就可以知道,这是一个显式声明,通过一个变量去接了函数,于是它就是(String) -> Void类型。
let logger: (String) -> Void = logMessage
注意
在定义闭包的时候,如果返回值为空,我更喜欢使用Void而不是(),因为这样开起来更舒服也更容易理解。
❤ var callback: (() -> Void)?
🙅🏻♀️ var callback: (() -> ())?
总结
好了,今天的知识点就到这里了。
Void并没有什么特别的,它就像Int、String代表整型、字符串这种类型一样,代表空元组类型。
我们下期见。