Search code examples
swiftclassinitializationcore-locationviewdidload

Swift init of class


I am pretty new to swift and can't get my head around the following code:


import Foundation
import MapKit
import CoreLocation


class SpeedViewModel: UIViewController, ObservableObject, CLLocationManagerDelegate {
    var locationManager: CLLocationManager = CLLocationManager()
    var speedtest = " km/h"

    override func viewDidLoad() {
            super.viewDidLoad()
        print ("test1111")

        // Ask for Authorisation from the User.
        self.locationManager.requestAlwaysAuthorization()

        // For use in foreground
        self.locationManager.requestWhenInUseAuthorization()
        if CLLocationManager.locationServicesEnabled() {
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
            locationManager.startUpdatingLocation()
        }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func updateLocationInfo(latitude: CLLocationDegrees, longitude: CLLocationDegrees, speed: CLLocationSpeed, direction: CLLocationDirection) {
        let speedToKPH = (speed * 3.6)
            if (speedToKPH > 0) {
                speedtest = (String(format: "%.0f km/h", speedToKPH))
            } else {
                speedtest = "0 km/h"
            }
    }
}

I don't understand why this code is not starting. Although it is not having any errors, it seems like the viewDidLoad() is never called and therefore the class is not doing anything to the rest of my app. Please help me to find the right initializer.


Solution

  • As I said in the comments, rather than UIViewController declare the class as a subclass of NSObject and initialize the location manager in the standard init method.

    updateLocationInfo is never being called by the framework. You have to implement locationManager(_ didUpdateLocations:) and get the speed from the location.

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    
        guard let speed = locations.first?.speed else { return }
        let speedToKPH = speed * 3.6
        if speedToKPH > 0 {
            speedtest = String(format: "%.0f km/h", speedToKPH)
        } else {
            speedtest = "0 km/h"
        }
    }