Marceloawq
Marceloawq

Reputation: 173

Return a view in enum

I have a enum

enum MenuLateralViewModel: Int, CaseIterable {
    case denuncia
    case autoConstatacao
    case notificacao
    case autoInfracao
    case debitos
    case profissional
    case sincronizacao
}

for each item i want to return a different view, i tried doing this:

   var destino: View {
        switch self {
        
        case .denuncia: return DenunciaFiltroView()
        case .autoConstatacao: return View2()
        case .notificacao: return View3()
        case .autoInfracao: return View3()
        case .debitos: return View5()
        case .profissional: return View6()
        case .sincronizacao: return View7()
        }
    }

but it gives me the error

Protocol 'View' can only be used as a generic constraint because it has Self or associated type requirements

How can i achieve this?

Upvotes: 2

Views: 1805

Answers (2)

user652038
user652038

Reputation:

Use ViewBuilder, and an opaque return type.

@ViewBuilder var destino: some View {
  switch self {
  case .denuncia: DenunciaFiltroView()
  case .autoConstatacao: View2()
  case .notificacao: View3()
  case .autoInfracao: View3()
  case .debitos: View5()
  case .profissional: View6()
  case .sincronizacao: View7()
  }
}

Upvotes: 7

Raja Kishan
Raja Kishan

Reputation: 18904

Use AnyView instead of View

enum MenuLateralViewModel: Int, CaseIterable {
    case view1
    case view2
    
    var destino: AnyView {
         switch self {
         case .view1: return AnyView(ContentView())
         case .view2: return AnyView(ContentViewSecond())
         }
     }
}

Upvotes: 1

Related Questions