2015-12-16 23 views
7

是什么传递[weak self]作为参数,以将闭合VS传递[weak self]()差()

例如之间的差:

dispatch_async(dispatch_get_main_queue()) { [weak self] in 
    //Some code here 
} 

V/S

dispatch_async(dispatch_get_main_queue()) { [weak self]() -> Void in 
    //Some code here 
} 
+0

@MartinR更新后的代码。实际上,在一些实现中,我看到[weak self]没有使用圆括号,有些我认为它被用作[weak self]()。这两者之间的区别究竟是什么? –

回答

9

您不会将[weak self]()作为参数传递给闭包。

  • [weak self]捕获列表和先于
  • 参数列表/返回类型声明() -> Void

在封闭的表达。

的返回类型或两者的参数列表并返回,如果他们能 从上下文来推断类型可以省略,因此,所有这些都是有效的 ,完全等同:

dispatch_async(dispatch_get_main_queue()) { [weak self]() -> Void in 
    self?.doSomething() 
} 

dispatch_async(dispatch_get_main_queue()) { [weak self]() in 
    self?.doSomething() 
} 

dispatch_async(dispatch_get_main_queue()) { [weak self] in 
    self?.doSomething() 
} 

闭合需要一个空参数列表()并具有Void 返回类型。

+0

()= Void。实际上你应该更喜欢Void而不是()以便清晰,因此这应该是Void - >无效 – Yariv

+0

@ yar1vn:这可能是个人品味的问题。我更喜欢用'()'作为空的/ void参数列表,'Void'作为返回类型。这也是Apple在'dispatch_block_t'定义中所做的。 –

+0

1. dispatch_block_t不是Swift函数。 2. Swift社区正在创建这个标准,它更喜欢Void。 3.但是你是对的,既然他们都工作,你可以选择你喜欢的任何一个 – Yariv