How do i resolve the error Type 'CommunityEventsApp' does not conform to protocol 'App'

Viewed 50

I've been stuck trying to debug this for a while so i thought i would ask for some advice as i've got to the point where i've really confused myself. I'm trying to get data from a local api that i've created and use mapkit to display the events i get from my api on the map.

In my apps entry point i have this error "Type CommunityEventsApp does not conform to protocol 'App', it appears on the same line as struct CommunityEventsApp: App. I've trying adding an initialiser above my body in this file as this is what the error suggested as the fix however this didn't resolve the error. I have no other errors in my app. This is the code:

struct CommunityEventsApp: App {
    @StateObject var viewModel: ContentViewModel
    var event: Event
    
    var body: some Scene {
        WindowGroup {
            TabView {
               //rest of the tab view code
            }
            .environmentObject(viewModel)
        }
    }
}

I'm trying to get data from a local api i've made here in my ContentViewModel:

    
    var eventsList: [Event]
    var primary: Event
    
    init() {
        self.eventsList = []
        self.primary = eventsList[0]
    }
    
    func getEvents() async throws {
        guard let url = URL(string: "http://localhost:5172/events") else {fatalError("Missing URL")}
        let urlRequest = URLRequest(url:url)
        let (data, response) = try await URLSession.shared.data(for: urlRequest)
        
        guard (response as? HTTPURLResponse)?.statusCode == 200 else { fatalError("Error while fetching data")}
        eventsList = try JSONDecoder().decode([Event].self, from:data)
        print("Async decodedEvent", eventsList)
    }
    
}

This is my Event struct

struct Event: Decodable, Identifiable {
    
    let id: String
    let title: String
    let date: String
    let time: String
    let location: String
    let latitude: Double
    let longitude: Double
    let price: Double
    let description: String
    let link: String?
    let imageUrl: String
    
    init(id: String,
         title: String,
         date: String,
         time: String,
         location: String,
         latitude: Double,
         longitude: Double,
         price: Double,
         description: String,
         link: String,
         imageUrl: String) {
        self.id = id
        self.title = title
        self.date = date
        self.time = time
        self.location = location
        self.latitude = latitude
        self.longitude = longitude
        self.price = price
        self.description = description
        self.link = link
        self.imageUrl = imageUrl
    }
}

I call getEvents inside the onAppear in the ContentView:

    let event: Event
    let viewModel: ContentViewModel
    
    var body: some View {
         // UI formatting here 
                .onAppear {
                    Task {
                        do {
                            try await viewModel.getEvents()
                        } catch {
                            print("Error", error)
                        }
                    }
                }
            }
            .navigationTitle("Event Information")
        }
    }
}

MapView where i use my api data to display events on the map:

    @EnvironmentObject var events: ContentViewModel
    @State var region = MKCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: 53.483959, longitude: -2.244644),
        span: MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2)
    )
    
    var body: some View {
        Map(coordinateRegion: $region,
            annotationItems: events.eventsList) {
            event in
            MapAnnotation(coordinate: CLLocationCoordinate2D(latitude: event.latitude, longitude: event.longitude)) {
                NavigationLink(destination: ContentView(event: event, viewModel: ContentViewModel())) {
                    Image(systemName: "pin.fill")
                        .onHover { hover in
                            print(event.title)
                        }
                }
            }
        }
            .navigationTitle("Events Near You")
    }
}

I don't have anyone else that i can ask for help so any help or information would be greatly appreciated! I'm still a beginner with Swift development and don't really feel comfortable with it yet. I'm using xcode version 13 and swift version 5

1 Answers

Your properties need default values.

The App struct is the entry point in your application. So every property needs to be properly initialized.

Especially your @StateObject var.

Related