斯威夫特让... {

时间:2018-04-10 17:21:16

标签: swift closures rx-swift

我知道这可能是一个非常基本的问题,但它一直在唠叨我。有人可以解释这个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示例中的var1var2var3(或celliplap感到困惑)是有意义的。谢谢!

2 个答案:

答案 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”部分对此进行了描述。

所以,最后一行,这个letdataSource设置为RxTableViewRealDataSource,其第三个参数是一个闭包,当需要配置单元格时,该闭包将在稍后调用。此闭包本身有三个参数celliplap,它们在调用时传递给此闭包。例如。在您的代码段中,您的尾随闭包使用第一个参数cell来了解需要更新的单元格,并且您的闭包正在更新单元格的标签以显示由ip.row和{组成的字符串{1}}。这些是闭包的参数,因为直到稍后调用闭包时才会知道它们,此时需要显示单元格。

答案 1 :(得分:0)

你正在混淆两个无关的事情。被调用的方法返回一个值,并将其分配给=之前命名的变量。末尾的块是尾随闭包,它是方法调用的最后一个参数。 var1, var2, var3 in语法是指定传递给闭包的参数的方式。