#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()
}
}