Swift中的Void

1,398 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

从今天开始我参加程序员必备小知识活动了,考虑活动的持续性和篇幅,我计划每一篇只讲解一个简单的知识点。

因为并没有做太多的准备了,可能内容就会比较混杂大家见谅。

那么开始今天的内容吧。

最熟悉的陌生人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代表整型、字符串这种类型一样,代表空元组类型。

我们下期见。