这是一个玩具示例,但它完全减少了我所处的情况:
class MyDataSource: UITableViewDiffableDataSource<String,String> {
var string : String?
init(string:String?) {
self.string = string
super.init(tableView: UITableView()) { (_, _, _) -> UITableViewCell? in
print(self.string) // error
return nil
}
}
}
我正在尝试使我的表视图数据源自包含,而我这样做的方式(到目前为止)是将 UITableViewDiffableDataSource 子类化。这很好用,除非我尝试给我的子类一个自定义初始化程序。玩具示例显示了问题。
我想要填充单元格的方式绝对取决于可以在数据源生命周期后期更改的值。因此,它不能硬编码到单元提供程序函数中。我不能在这里简单地引用string
初始化器中传递的值;我必须参考,self.string
因为稍后其他代码将有权更改此数据源的string
实例属性,并且我希望单元提供程序在发生这种情况时使用该新值。
但是,我收到错误“在所有成员初始化之前由闭包自我捕获”。这似乎不公平。我确实string
在调用之前初始化了我的实例属性super.init
。因此,在可能调用单元格提供程序方法的最早时刻,它确实具有价值。