Список инициализаторов SwiftUI, как это реализовано? - PullRequest
1 голос
/ 18 января 2020

Я могу сделать что-то подобное, чтобы походить на мой 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

            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...