根据文档" 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?
答案 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
}
}