Можно ли вернуть разные View
с в зависимости от потребностей?
Короче говоря: Сортировка
Как это полностью описано в swift.org , IMPOSSIIBLE иметь несколько Type s, возвращающихся как opaque type
Если функция с непрозрачным типом возврата возвращается из нескольких мест, все возможные возвращаемые значения должны иметь один и тот же тип. Для универсальной функции этот возвращаемый тип может использовать параметры универсального типа функции, но он все равно должен быть одного типа.
Так как же List
может сделать это, когда статически передаются несколько разных представлений?
Список не возвращает разные типы, он возвращает EmptyView
, заполненный некоторым представлением содержимого. Разработчик может создать оболочку вокруг любого типа представлений, которые вы ему передаете, но когда вы используете все больше и больше представлений, он даже не собирается компилироваться вообще! (попробуйте, например, пройти более 10 просмотров и посмотреть, что получится)
Как видите, содержимое List
- это своего рода ListCoreCellHost
, содержащее подмножество представлений, доказывающее, что это просто контейнер того, что оно представляет.
Что если у меня много данных (например, контактов) и я хочу заполнить список для этого?
Вы можете соответствовать Identifiable
или использовать функцию identified(by:)
, как описано здесь .
Что, если какой-либо контакт может иметь другое представление?
Когда вы называете их контактными, это означает, что они одно и то же! Вы должны рассмотреть ООП, чтобы сделать их одинаковыми и использовать inheritance
преимущества. Но в отличие от UIKit
, SwiftUI
основан на структурах. Они не могут наследовать друг друга.
Так в чем же решение?
Вы ДОЛЖНЫ обернуть все виды представлений, которые вы хотите отобразить, в один тип View
. Документации для EmptyView
недостаточно, чтобы воспользоваться этим (пока). НО !!! к счастью, вы можете использовать UIKit
Как я могу воспользоваться UIKit
для этого
- Реализация
View1
и View2
поверх UIKit
.
- Определите
ContainerView
с UIKit.
- Реализуйте
ContainerView
способ, который принимает аргумент и представляет View1
или View2
и размер для соответствия.
- Соответствовать
UIViewRepresentable
и выполнять его требования.
- Сделайте ваш SwiftUI
List
, чтобы показать список ContainerView
Так что теперь это один тип, который может представлять несколько представлений