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