Я могу сделать что-то подобное, чтобы походить на мой CustomList на собственный список SwiftUI. Но я думаю, что этот подход не очень эффективен, и SwiftUI делает это под своим компонентом List.
// MARK: - Properties
private let items: [AnyView]
public init<Data, RowContent>(onReorder: @escaping (Int, Int) -> Void = { _,_ in }, onDelete: ((Int) -> Bool)? = nil, _ data: Data, @ViewBuilder rowContent: @escaping (Data.Element) -> RowContent) where Data : RandomAccessCollection, RowContent : View, Data.Element : Identifiable {
var items = [AnyView]()
data.forEach { element in
let item = rowContent(element)
items.append(AnyView(item))
}
self.items = items
}
public init<Data, ID, RowContent>(onReorder: @escaping (Int, Int) -> Void = { _,_ in }, onDelete: ((Int) -> Bool)? = nil, _ data: Data, id: KeyPath<Data.Element, ID>, @ViewBuilder rowContent: @escaping (Data.Element) -> RowContent) where Data : RandomAccessCollection, ID : Hashable, RowContent : View {
var items = [AnyView]()
data.forEach { element in
let item = rowContent(element)
items.append(AnyView(item))
}
self.items = items
}
public init<RowContent>(onReorder: @escaping (Int, Int) -> Void = {_,_ in }, onDelete: ((Int) -> Bool)? = nil, _ data: Range<Int>, @ViewBuilder rowContent: @escaping (Int) -> RowContent) where RowContent : View {
var items = [AnyView]()
data.forEach { element in
let item = rowContent(element)
items.append(AnyView(item))
}
self.items = items
}
Как я могу сделать так, чтобы все это init-хранилище сохраняло что-то подобное в свойствах
private let items: Data // where Data : RandomAccessCollection
private let rowContent: (Data.Element) -> Content
и чтобы все данные инициализации, включая RandomAccessCollection, соответствовали этому. У меня есть много способов добиться этого. но не знает как это сделать.
Я хочу создать вид, подобный этому
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "HostingCell") as! HostingTableViewCell
let item = parent.items[indexPath.row]
let rootView = parent.rowContent(item)
cell.host(rootView: rootView)
return cell
}