Swift - 当前位置拥有 struct/class (CLLocationManager)

Swift - Own struct/class for current location (CLLocationManager)

我想创建一个自己的结构或 class 来获取用户的当前位置。

我似乎无法在结构中使用 CLLocationManager 及其函数(didUpdateLocations、didFailWithError 等)(Xcode 使所有文本颜色变为黑色,我收到一条错误消息 An internal error occurred. Source editor is limited.).当我使用 class 并尝试使用 "getPlacemark" 函数(从实例化的 class 中获取地标)或直接从创建的实例中获取地标时("instancedClass.placemarkInClass" ), 但没有任何效果,我只得到 Thread 1: EXC_BAD_ACCESS

这是我最后一次尝试创建 class:

import Foundation
import MapKit

class UserLocation: NSObject, CLLocationManagerDelegate{

    var mLocationManager: CLLocationManager
    var placemark: CLPlacemark

    override init(){
        placemark = CLPlacemark()
        self.mLocationManager = CLLocationManager()
        self.mLocationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.mLocationManager.requestWhenInUseAuthorization()
        self.mLocationManager.startUpdatingLocation()
    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error) -> Void in

            if (error != nil) {
                print("Error: " + (error?.localizedDescription)!)
                return
            }
            if (placemarks?.count > 0) {
                let pm = placemarks![0]
                self.placemark = pm
                print(self.placemark.areasOfInterest)
                self.mLocationManager.stopUpdatingLocation()
            }

        })

    }

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        print("Error: " + (error.localizedDescription))
    }

    func getPlacemark() -> CLPlacemark{
        return self.placemark
    }

}

在我的 ViewController 中,我将其设为实例变量 ( currentLocation = CurrentLocation() ) 并尝试同时使用

let userPlacemark = currentLocation.getPlacemark() and let userPlacemark = currentLocation.placemark but nothing is working.

有没有办法拥有自己的 class 或结构来获取当前位置并在其他 ViewController 中使用它?

您的代码有两个观察结果:

  1. 一旦你完成成员变量的设置,你就不会在你的init中调用[super init]。修改你的初始化为

         init(){
    
           placemark = CLPlacemark()
    
            mLocationManager = CLLocationManager()
            mLocationManager.desiredAccuracy = kCLLocationAccuracyBest
            mLocationManager.requestWhenInUseAuthorization()
            mLocationManager.startUpdatingLocation()
            super.init()
            mLocationManager.delegate = self
           }
    
  2. 正在设置位置管理器的委托。您应该在创建位置管理器实例后立即在 init 中执行此操作。参见上面的初始化代码。