Я устал от SwiftUI и хочу сделать несколько функциональных версий HStack.
Однако я столкнулся с небольшой проблемой. А именно ошибка:
Type 'any View' cannot conform to 'View'
Минимальный пример, который вызывает эту ошибку:
import Foundation
import SwiftUI
func row(_ views: Array<any View>) -> some View {
HStack() {
ForEach(0..<views.count) {
views[$0] // the error is here
}
}
}
Что мне сделать, чтобы исправить пример?
Где я могу увидеть, до чего расширяется HStack?
Вы не можете, это почти невозможно из-за сложности типов, тип представления без ViewBuilder может иметь много слоев; слой для каждого вида, модификатора и типа; SwiftUI основан на модели, вы передаете данные модели и создаете представления на основе этих данных. Вы не пропускаете взгляды.
Определенно первый комментарий: храните данные в массивах, стройте представления с этими данными. Не храните массивы просмотров
В моем случае представления были данными. Я изучаю реализацию языка изображений Хендерсона и хотел посмотреть, могут ли изображения быть представлены как представления. Я решил использовать другой подход.





Вы можете сделать row универсальным поверх конкретного типа, например:
func row<Content>(_ views: [Content]) -> some View where Content: View {
HStack() {
ForEach(Array(0 ..< views.count), id: \.self) {
views[$0]
}
}
}
Это хорошее решение, но оно ограничивает row представлениями одного типа. То есть row([Text("Hello"), Image(systemName: "globe")]) не работает
Я принял этот ответ, так как это самый практичный ответ.
Представления не должны храниться в виде массивов, также swiftui не справляется с экзистенциалами, вы должны придерживаться конкретных типов. загляните в
ViewBuilder, диапазоны также считаются небезопасными, вам следует посмотреть «Demystify SwiftUI», там есть распространенные заблуждения SwiftUI-новичков, особенно исходящие из других языков.