gpt4 book ai didi

ios - 在初始化所有成员之前, self 被闭包捕获 - 但我确实初始化了它们

转载 作者:行者123 更新时间:2023-12-01 18:58:48 25 4
gpt4 key购买 nike

这是一个玩具示例,但它准确地减少了我所处的情况:

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
}
}
}

我试图使我的 TableView 数据源独立,而我的方法(到目前为止)是子类化 UITableViewDiffableDataSource。除非我尝试为我的子类提供自定义初始值设定项,否则这工作正常。玩具示例显示了问题。

我想要填充单元格的方式绝对取决于可以在数据源生命周期后期更改的值。因此它不能被硬编码到单元提供者函数中。我在这里不能简单地引用string,即在初始化程序中传递的值;我必须引用 self.string ,因为其他代码稍后将有权更改此数据源的 string 实例属性,并且我希望单元格提供程序使用该属性发生这种情况时新的值。

但是,我收到错误“在初始化所有成员之前由闭包自行捕获”。这似乎不公平。在调用 super.init 之前,我确实初始化了我的 string 实例属性。因此,当单元提供者方法可能被调用时,它确实具有最早的值(value)。

最佳答案

虽然我不完全确定为什么 Swift 不允许这样做(与捕获 self 在实际调用 之前创建闭包有关) super.init 已创建),我至少知道它的解决方法。相反,捕获一个弱局部变量,并在调用 super.init 后将该局部变量设置为 self:

class MyDataSource: UITableViewDiffableDataSource<String,String> {
var string : String?
init(string:String?) {
self.string = string
weak var selfWorkaround: MyDataSource?
super.init(tableView: UITableView()) { (_, _, _) -> UITableViewCell? in
print(selfWorkaround?.string)
return nil
}

selfWorkaround = self
}
}

但是,唯一的问题是,如果在调用 super.init 期间执行闭包,那么 selfWorkaround 将在闭包内为零,你可能会得到意想不到的结果。 (不过,在这种情况下,我认为不是 - 所以你这样做应该是安全的。)

编辑:我们将局部变量设为weak的原因是为了防止self对象被泄漏。

关于ios - 在初始化所有成员之前, self 被闭包捕获 - 但我确实初始化了它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60252478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com