我知道这可能是一个非常基本的问题,但它一直在唠叨我。有人可以解释这个let
的想法是什么吗?或者至少是它常用的东西?我一直看到变量如:
let thisVar = ... { var1, var2, var3 in
methods
}
这是RxRealmDataSources的一个例子:
let dataSource = RxTableViewRealmDataSource<Lap>(cellIdentifier: "Cell", cellType: PersonCell.self) {cell, ip, lap in
cell.customLabel.text = "\(ip.row). \(lap.text)"
}
我对RxRealmDataSources示例中的var1
,var2
和var3
(或cell
,ip
,lap
感到困惑)是有意义的。谢谢!
答案 0 :(得分:1)
考虑一下:
let dataSource = RxTableViewRealmDataSource<Lap>(cellIdentifier: "Cell", cellType: PersonCell.self) {cell, ip, lap in
cell.customLabel.text = "\(ip.row). \(lap.text)"
}
这是实例化RxTableViewRealmDataSource
,其中此初始化方法的第三个参数是closure。在这种情况下,此闭包只是您提供给数据源的一些代码,以告诉它在准备配置单元格时要执行的操作。事实上,我们实际上可以查看source code for this init
method:
public init<CellType>(cellIdentifier: String, cellType: CellType.Type, cellConfig: @escaping TableCellConfig<E, CellType>) where CellType: UITableViewCell {
self.cellIdentifier = cellIdentifier
self.cellFactory = {ds, tv, ip, model in
let cell = tv.dequeueReusableCell(withIdentifier: cellIdentifier, for: ip) as! CellType
cellConfig(cell, ip, model)
return cell
}
}
不要迷失在那里的细节,但只需注意它需要三个参数,其中最后一个参数是TableCellConfig
类型的闭包。这个闭包是“@escaping
”,这意味着稍后会调用一些代码(当需要配置单元格时)。
注意,这第三个参数称为cellConfig
,但您的代码片段使用“尾随闭包”语法使其更简洁,因此最后一个参数,因为它是一个闭包,可以省略其标签并且在初始化器之后立即附加闭包。 The Swift Programming Language: Closures中的“Tailing Closures”部分对此进行了描述。
所以,最后一行,这个let
将dataSource
设置为RxTableViewRealDataSource
,其第三个参数是一个闭包,当需要配置单元格时,该闭包将在稍后调用。此闭包本身有三个参数cell
,ip
和lap
,它们在调用时传递给此闭包。例如。在您的代码段中,您的尾随闭包使用第一个参数cell
来了解需要更新的单元格,并且您的闭包正在更新单元格的标签以显示由ip.row
和{组成的字符串{1}}。这些是闭包的参数,因为直到稍后调用闭包时才会知道它们,此时需要显示单元格。
答案 1 :(得分:0)
你正在混淆两个无关的事情。被调用的方法返回一个值,并将其分配给=
之前命名的变量。末尾的块是尾随闭包,它是方法调用的最后一个参数。 var1, var2, var3 in
语法是指定传递给闭包的参数的方式。