阅读 81

Swift中的Void

前言

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

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

那么开始今天的内容吧。

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

我们下期见。


作者:season_zhu
链接:https://juejin.cn/post/7011372310988849165


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐