Swift中什么时候不能用 () 代替 Void 来使用

Posted 大熊猫侯佩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift中什么时候不能用 () 代替 Void 来使用相关的知识,希望对你有一定的参考价值。

概述

这是一篇很短的文章。

我们知道,在Swift中 () 和 Void 在一些场合下是可以互为替代的,它们都表示“空”类型。注意该“空”类型和nil类型不是一回事,后者其实是Optional的一种,而前者表示“没有任何值”。

比如,我们可以这样写:

func test(_ handler: () -> Void)
    handler()

也可以这样写:

func test(_ handler: () -> ())
    handler()

它们都表示handler闭包返回“空”值,即不返回任何值。

那么,在什么情况下不能用()表示Void呢?

一种场合是:当我们需要传递“空”类型本身,而不是“空”类型表示值的时候。

什么意思?

下面举个栗子 😉

一个栗子🌰

let start = Date.timeIntervalSinceReferenceDate
// 需要明确我们的任务组返回的类型为“空”类型本身,而不是“空”类型对应的值
await withThrowingTaskGroup(of: Void.self, body: 
  for _ in 0 ..< 100 
    $0.addTask 
      try await Task.sleep(nanoseconds: 1_000_000_000)
    
  
)
let end = Date.timeIntervalSinceReferenceDate
print(String(format: "Duration: %.2fs", end-start))

如上所示,异步函数withThrowingTaskGroup的第一个参数需要传递的是“空”类型本身,而不是它所对应的值,所以我们需要用 Void.self 而不是 Void 来填充。

但是,这里不可以使用() ,即:

await withThrowingTaskGroup(of: ().self, body: 
  for _ in 0 ..< 100 
    $0.addTask 
      try await Task.sleep(nanoseconds: 1_000_000_000)
    
  
)

这会导致编译失败:

总结

通过这个小栗子,我们学习了 () 和 Void 可以和不可以相互替代的场景,小伙伴学会了吗?

感谢观赏,再会了!😎

以上是关于Swift中什么时候不能用 () 代替 Void 来使用的主要内容,如果未能解决你的问题,请参考以下文章

请问在C程序中啥时候用int main() 啥时候用 void main()。二者是不是可以相互代替?

Swift中什么时候用变量参数inout参数

平时容易忽视的地方之一:java在抽取方法时,什么时候该用void

在 Swift 2 中用啥代替 stringByAppendingPathComponent [重复]

Swift 4:NSFilenamesPboardType 不可用。用啥代替 registerForDraggedTypes?

iOS边练边学--Segue数据逆传(用block代替delegate)