Я хочу вынести координаты, полученные в делегате - PullRequest
0 голосов
/ 24 марта 2019

Я написал программу, которая использует LocationManagerDelegate для отображения координат в области отладки при каждом изменении текущего местоположения.Ошибка при получении координат

Невозможно использовать элемент экземпляра locationManager в инициализаторе свойства;Инициализаторы свойств запускаются до того, как станет доступным 'self'

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate{

var locationManager: CLLocationManager!

override func viewDidLoad() {
    super.viewDidLoad()
     // Do any additional setup after loading the view, typically from a nib.

   setUpLocationManager()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func setUpLocationManager() {
    locationManager = CLLocationManager()
    guard let locationManager = locationManager else {return}
    locationManager.requestWhenInUseAuthorization()
    let status = CLLocationManager.authorizationStatus()
    if status == .authorizedWhenInUse {
        locationManager.delegate = self
        locationManager.distanceFilter = 10
        locationManager.startUpdatingLocation()
        printLocation()
    }
}


func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) ->Optional<Any> {
    let location = locations.first
    let latitude = location?.coordinate.latitude
    let longitude = location?.coordinate.longitude
    let latlong = [latitude, longitude]
    return latlong
}
let myLocation = locationManager()

func printLocation() {
    print("test\(myLocation)")
}

}

test (Function) выводится

let myLocation = locationManager ()

При изменении на

let myLocation = locationManager

1 Ответ

1 голос
/ 24 марта 2019

Ваш код содержит несколько ошибок.

Ошибка возникает из-за того, что вы не можете выполнить затронутую строку на верхнем уровне класса.


Прежде всего, вы не должны изменять сигнатуры методов-делегатов. Это пользовательский метод делегата

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) ->Optional<Any> { ...

никогда не будет вызван .

И кроме того, почему вы объявляете тип возвращаемого значения как Any?, хотя он должен быть [CLLocationCoordinate2D]?


  • Создайте менеджер местоположения немедленно, замените

    var locationManager: CLLocationManager!
    

    с

    let locationManager = CLLocationManager()
    
  • В setUpLocationManager() удалить строки

    locationManager = CLLocationManager()
    guard let locationManager = locationManager else {return} // this line is completely pointless anyway
    
    
    
    printLocation()
    

  • Метод делегата didUpdateLocations вызывается периодически, а асинхронно . Вывести результат внутри метода

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let location = locations.first else { return }
        let latitude = location.coordinate.latitude
        let longitude = location.coordinate.longitude
        let latlong = [latitude, longitude]
        print("test", latlong)
    }
    
  • Удалить

    let myLocation = locationManager()
    
    func printLocation() {
        print("test\(myLocation)")
    }
    

...