Это игрушечный пример, но он точно уменьшает ситуацию, в которой я нахожусь:
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
. Таким образом, он имеет значение в самый ранний момент, когда метод провайдера ячейки может быть вызван.