Swift中的Void

語言: CN / TW / HK


highlight: tomorrow-night-blue

小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動。

前言

從今天開始我參加程式設計師必備小知識活動了,考慮活動的持續性和篇幅,我計劃每一篇只講解一個簡單的知識點。

因為並沒有做太多的準備了,可能內容就會比較混雜大家見諒。

那麼開始今天的內容吧。

最熟悉的陌生人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 isVoidif otherwise unspecified. /// UseVoid` 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代表整型、字串這種型別一樣,代表空元組型別。

我們下期見。