Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

131
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!