Как применить HStack к массиву представлений?

Я устал от 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
        }
    }
}

Что мне сделать, чтобы исправить пример?

Представления не должны храниться в виде массивов, также swiftui не справляется с экзистенциалами, вы должны придерживаться конкретных типов. загляните в ViewBuilder, диапазоны также считаются небезопасными, вам следует посмотреть «Demystify SwiftUI», там есть распространенные заблуждения SwiftUI-новичков, особенно исходящие из других языков.

lorem ipsum 22.04.2023 20:03

Где я могу увидеть, до чего расширяется HStack?

soegaard 22.04.2023 20:12

Вы не можете, это почти невозможно из-за сложности типов, тип представления без ViewBuilder может иметь много слоев; слой для каждого вида, модификатора и типа; SwiftUI основан на модели, вы передаете данные модели и создаете представления на основе этих данных. Вы не пропускаете взгляды.

lorem ipsum 22.04.2023 21:45

Определенно первый комментарий: храните данные в массивах, стройте представления с этими данными. Не храните массивы просмотров

timbre timbre 22.04.2023 22:13

В моем случае представления были данными. Я изучаю реализацию языка изображений Хендерсона и хотел посмотреть, могут ли изображения быть представлены как представления. Я решил использовать другой подход.

soegaard 01.05.2023 19:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать 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")]) не работает

soegaard 22.04.2023 20:11

Я принял этот ответ, так как это самый практичный ответ.

soegaard 24.04.2023 12:38

Другие вопросы по теме

Как увеличить высоту фигуры на основе содержимого ее наложения в SwiftUI
NavigationStack iOS16 с рутом, как вернуться к руту?
Как я могу сделать так, чтобы разные представления отображались в зависимости от того, какая аннотация карты нажата?
Не удается разобрать ответ JSON в SwiftUI
Как заставить мой список прокручиваться, чтобы показать последнюю строку в резервном массиве строк, используя SwiftUI под macOS
Проблема с анимацией SwiftUI NavigationStack при возврате к родительскому представлению
UIViewRepresentable: нельзя использовать изменяющийся член для неизменяемого значения: «я» неизменяемо
Переключатель SwiftUI не переключается в тесте пользовательского интерфейса
Swift/SwiftUI Попытка передать массив из одного представления в другое, который ошибочно помечен как нулевой
Неустранимая ошибка: не найден ObservableObject типа IconNames. View.environmentObject(_:) для IconNames может отсутствовать как предок этого представления