Swift - 如何理解速记参数名称

时间:2015-03-29 11:40:33

标签: swift

根据文档" Swift自动为内联闭包提供简写参数名称,可用于通过名称$ 0,$ 1,$ 2等来引用闭包参数的值。&#34 ;

reversed​ = ​sorted​(​names​, { ​s1​, ​s2​ ​in​ ​s1​ > ​s2​ } )

可以修改为:

​reversed​ = ​sorted​(​names​, { ​$0​ > ​$1​ } )

在另一个其他代码段中,

var viewModel: ArticleViewViewModel {
    didSet {
    viewModel.title.bindAndFire {
        [unowned self] in
        self.titleLabel.text = $0
  }
....

1,为什么$0不代表[unowned self]

2,为什么' $ 0'等于viewModel.title?

1 个答案:

答案 0 :(得分:4)

因为[unowned self]是一个闭包捕获列表,所以它不是一个参数。

{ 
[unowned self]  // Capture list
(a:String, b:Int) //Arguments names
 in
   ...   //Closure body
}

捕获列表显示为闭包中的第一项。它们列在任何参数子句或标识符列表之前,并且需要使用in关键字。

来自The Swift Programming Language Automatic Reference Counting

的闭包的强引用周期
  

...

     

这种强引用循环的发生是因为闭包就像类一样   参考类型。当你为一个属性分配一个闭包时,你就是   为该闭包分配引用。从本质上讲,它是一样的   如上所述的问题 - 两个强有力的参考是彼此保持活力。   但是,这次是一个类,而不是两个类实例   实例和一个让对方保持活力的封闭。

     

Swift为这个问题提供了一个优雅的解决方案,称为闭包捕获列表。但是,在你学习如何打破之前   强大的引用循环与闭包捕获列表,它是有用的   了解如何引起这样的循环。

关闭的例子:

[1, 2, 3].map( { (i: Int) ->Int in return i * 2 } )
[1, 2, 3].map( { i in return i * 2 } )
[1, 2, 3].map( { i in i * 2 } )
[1, 2, 3].map( { $0 * 2 } )
[1, 2, 3].map() { $0 * 2 }
[1, 2, 3].map { $0 * 2 }

根据您提供的来源,我相信原件来自 http://rasic.info/bindings-generics-swift-and-mvvm/

class Dynamic<T> {
  typealias Listener = T -> Void
  var listener: Listener?

  func bind(listener: Listener?) {
    self.listener = listener
  }

  func bindAndFire(listener: Listener?) {
    self.listener = listener
    listener?(value)
  }

  var value: T {
    didSet {
      listener?(value)
    }
  }

  init(_ v: T) {
    value = v
  }
}