Swift中的Void
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 is
Voidif 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代表整型、字串這種型別一樣,代表空元組型別。
我們下期見。
- Swift的中MD5加密演算法
- Swift:let與var
- 建議CV,Swift中使用UserDefault的一點經驗
- 酸了的我寫下這篇文章:用Xcode編寫適合自己的程式碼塊
- Swift:有了SFSafeSymbols庫,沒有UI我也不愁了
- 為Alamofire4新增Codable協議擴充套件
- JSON轉模型工具
- 使用TinyPNG壓縮圖片
- Swift:適配深色模式適配與UIColor擴充套件
- XDM都用什麼Markdown寫作工具?
- Swift中的Any&AnyObject
- 我的wanandroid客戶端簡單適配iOS 15
- SwiftyJSON原始碼的一點學習心得
- Swift:為String、Array、Dictionary新增isNotEmpty屬性
- Swift中的tuple(元組)
- Swift中的Void
- iOS:Guideline 5.1.1,記一次稽核被拒
- CupertinoDatePicker不好使,自己擼一個小時與分鐘的時間選擇器
- Flutter列舉的缺點
- 2020年上半年宅家學Flutter | 掘金徵文