Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

128
Vistas
Cómo optimizar la caja del interruptor en swiftui

Tengo una vista para mostrar diferentes estilos según los parámetros pasados.

Hay más de 50 estilos diferentes, cada estilo tiene un diseño de conflicto. Quiero mostrar diferentes estilos según el estilo pasado.

Tengo que escribir más de 50 casos de la siguiente manera:

 struct StyleDefaultView: View { let style: Int var body: some View { VStack() { Text("111") } } } struct Style1View: View { let style: Int var body: some View { HStack() { VStack() { Text("111") } Text("222") } } } struct Style2View: View { let style: Int var body: some View { VStack() { Text("111") HStack() { Text("111") Text("111") } } Text("222") } } struct Style3View: View { let style: Int var body: some View { HStack() { Text("111") VStack() { Text("111") Text("111") } } Text("222") } } struct Style4View: View { let style: Int var body: some View { HStack() { Text("222") VStack() { Text("111") Text("111") } Text("111") } } } // ... other 50+ style struct ContentView: View { let style: Int var body: some View { VStack() { switch style { case 1: Style1View(style: style) case 2: Style2View(style: style) case 3: Style3View(style: style) case 4: Style4View(style: style) // case .. other 50+ style default: StyleDefaultView(style: style) } } } }

¿Hay alguna manera de simplificar estos códigos de casos rápidos? Similar a la reflexión en Java como código de abajo

 struct ContentView: View { let style: Int let viewMap = [ 0 : "StyleDefaultView", 1 : "Style1View", 2 : "Style2View", 3 : "Style3View", // ... other 50 views ] var body: some View { let viewName: String = viewMap[style] ?? "StyleDefaultView" // initialization a view by a string viewName(style : style) } }
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

EDITAR:

este es solo un ejemplo para que piense en recorrer sus diferentes vistas de estilo:

 struct StyleDefaultView: View { var body: some View { VStack() { Text("111") } } } struct Style1View: View { var body: some View { HStack() { VStack() { Text("111") } Text("222") } } } struct Style2View: View { var body: some View { VStack() { Text("111") HStack() { Text("111") Text("111") } } Text("222") } } struct Style3View: View { var body: some View { Text("1112") Text("1112") Text("1112") } } struct Style4View: View { var body: some View { Text("1112") Text("1") } } class StyleViewModel { let styles: [AnyView] = [ AnyView(Style1View()), AnyView(Style2View()), AnyView(Style3View()), AnyView(Style4View())] func selectedStyleView(_ ndx: Int) -> AnyView { if ndx < styles.count { return styles[ndx] } else { return AnyView(StyleDefaultView()) } } } struct ContentView: View { let styles = StyleViewModel() let style: Int = 2 var body: some View { styles.selectedStyleView(style) } }
over 4 years ago · Santiago Trujillo Denunciar

0

Creo que una manera mucho mejor es usar un protocolo al que se ajuste cada uno de estos. Luego, solo necesita almacenar los tipos, lo que significa que es realmente liviano ya que no está instanciando un montón de vistas que quizás no necesite usar.

Ejemplo

En primer lugar, el ContentView para que pueda ver principalmente lo que está sucediendo. Es un ejemplo interactivo con un Slider para que pueda cambiar el estilo para probarlo.

 struct ContentView: View { private static let styleTypes: [StyledView.Type] = [ StyleDefaultView.self, Style1View.self, Style2View.self, Style3View.self, Style4View.self ] @State private var currentStyle = 0 var body: some View { VStack { Text("Style: \(currentStyle)") Slider( value: Binding<Double>( get: { Double(currentStyle) }, set: { currentStyle = Int($0) } ), in: 0 ... 4, step: 1 ) Spacer() Self.styleTypes[currentStyle].init().buildView() } } }

Resultado (con el resto del código también):

Resultado

Protocolo:

 protocol StyledView { init() func buildView() -> AnyView } extension StyledView where Self: View { func buildView() -> AnyView { AnyView(self) } }

Ahora todo lo que necesita hacer es ajustar cada vista a StyledView , sin necesidad de código adicional en cada una de esas vistas. Ejemplo para la primera vista (pero haz esto para todos ellos):

 struct StyleDefaultView: View, StyledView { var body: some View { VStack() { Text("111") } } }

Nota al margen: el VStack no necesita esos () después ya que tiene un cierre final.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda