Как я могу создать пустой массив представления, а затем инициализировать его для рендеринга в SwiftUI?

#swiftui

#swiftui

Вопрос:

Я получил 3 закодированных представления с такими именами: circleView1, circleView2, circleView3, которые в основном отображают изображение круга 1,2 и 3.

Моя цель: я хочу добавить эти 3 представления в пустой массив для использования.

Коды имеют проблему, не работают!

 import SwiftUI


struct circleView1: View { var body: some View { Image(systemName: "1.circle").font(Font.largeTitle).padding() } }
struct circleView2: View { var body: some View { Image(systemName: "2.circle").font(Font.largeTitle).padding() } }
struct circleView3: View { var body: some View { Image(systemName: "3.circle").font(Font.largeTitle).padding() } }



struct ContentView: View {
    
   var shapeArray: [View] = [EmptyView()]
    

    var body: some View {
        
        

        VStack
        {
            shapeArray()
        }
        .onAppear()
        {
            shapeArray().append(circleView1)
            shapeArray().append(circleView2)
            shapeArray().append(circleView3)
        }
        
        
    }
}
  

Комментарии:

1. A View — это не вещь — это протокол, который определяет, какие соответствующие типы должны поддерживать, поэтому у вас не может быть массива чего-то, что не является вещью (по крайней мере, не в текущей версии Swift). У вас может быть массив Image представлений или AnyView представлений, но не произвольных типов (которые все разные), которые соответствуют представлению. Как вы думаете, зачем вам здесь нужен массив? И в этом вопросе все представления «круга» на самом деле являются одним и тем же базовым типом. Почему они определены как разные типы?

2. Это не так, как SwiftUI работает с представлениями, и, хотя это возможно, путем переноса каждого в AnyView, но многие автоматические вещи будут / могут быть нарушены (например, environment / environmentObject, привязка, приравнивание и т.д.)… вы действительно этого хотите?

Ответ №1:

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

Мой рабочий пример:

 import SwiftUI

struct circleView1: View { var body: some View { Image(systemName: "1.circle").font(Font.largeTitle).padding() } }
struct circleView2: View { var body: some View { Image(systemName: "2.circle").font(Font.largeTitle).padding() } }
struct circleView3: View { var body: some View { Image(systemName: "3.circle").font(Font.largeTitle).padding() } }

struct ContentView: View {
   var shapeArray: [AnyView] = []
    
    var body: some View {
        VStack {
            ForEach(0..<self.shapeArray.count) { i in
                self.shapeArray[i]
            }
        }
    }
    
    init() {
        self.shapeArray.append(AnyView(circleView1()))
        self.shapeArray.append(AnyView(circleView2()))
        self.shapeArray.append(AnyView(circleView3()))
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}