私はSwift 3でコアロケーションマネージャを実装しました。デリゲートからロケーション値を取得し、クロージャの値を返しますが、そうすることはできませんでした。どんな助けもありがとう。Closureのコア位置デリゲートの値
マイコード:
import Foundation
import CoreLocation
class LocationManager : NSObject, CLLocationManagerDelegate{
var location: CLLocation?
var locationManager : CLLocationManager?
var currentLocation : CLLocationCoordinate2D?
var latitude : String?
var longitude : String?
var lat : Float?
var lon : Float?
// var locationManagerCallback : (Float?,Float?,String?,String?) ->()
static let sharedInstance : LocationManager = {
let instance = LocationManager()
return instance
}()
// MARK: - CLLocation Fetch Methods
func fetchLocationWithCompletionHandler(completion : @escaping(Float?,Float?,String?,String?) ->()) -> Void {
if locationManager != nil {
locationManager?.stopUpdatingLocation()
locationManager?.delegate = nil
locationManager = nil
}
locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.distanceFilter = kCLLocationAccuracyNearestTenMeters
locationManager?.desiredAccuracy = kCLLocationAccuracyBest
let requestWhenInUseSelector = NSSelectorFromString("requestWhenInUseAuthorization")
let requestAlwaysSelector = NSSelectorFromString("requestAlwaysAuthorization")
if (locationManager?.responds(to: requestWhenInUseSelector))! {
locationManager?.requestWhenInUseAuthorization()
}else if (locationManager?.responds(to: requestAlwaysSelector))!{
locationManager?.requestAlwaysAuthorization()
}
locationManager?.startUpdatingLocation()
}
func requestWhenInUseAuthorization() -> Void {
let status : CLAuthorizationStatus = CLLocationManager.authorizationStatus()
if status == CLAuthorizationStatus.denied || status == CLAuthorizationStatus.restricted {
// TODO : Handle Denial Here
}else if status == CLAuthorizationStatus.notDetermined{
locationManager?.requestWhenInUseAuthorization()
}
}
func requestAlwaysAuthorization() -> Void {
let status : CLAuthorizationStatus = CLLocationManager.authorizationStatus()
if status == CLAuthorizationStatus.denied || status == CLAuthorizationStatus.restricted {
// TODO : Handle Denial Here
}else if status == CLAuthorizationStatus.notDetermined{
locationManager?.requestAlwaysAuthorization()
}
}
func reveseGeocode(currentLocation : CLLocation, completionCallback : @escaping(CLPlacemark?,Error?) -> Swift.Void) -> Void {
let reverseGeocoder : CLGeocoder = CLGeocoder()
reverseGeocoder.reverseGeocodeLocation(currentLocation) { (placemarkArray, error) in
let placemark : CLPlacemark = (placemarkArray?.first)!
completionCallback(placemark,error)
}
}
// MARK: - CLLocation Delegate Methods
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
self.location = locations[0]
currentLocation = self.location?.coordinate
lat = Float((currentLocation?.latitude)!)
lon = Float((currentLocation?.longitude)!)
latitude = String(format: "%lf",lat!)
longitude = String(format : "%lf",lon!)
UserDefaults.standard.set(lat, forKey: CURR_LAT_VAL)
UserDefaults.standard.set(lon, forKey: CURR_LON_VAL)
UserDefaults.standard.set(latitude, forKey: CURR_LAT_STR)
UserDefaults.standard.set(longitude, forKey: CURR_LON_STR)
UserDefaults.standard.synchronize()
print("\(lat)\(lon)\(latitude)\(longitude)")
// locManager(lat,lon,latitude,longitude)
}
func locationManagerDidPauseLocationUpdates(_ manager: CLLocationManager) {
print("location manager did pause")
}
func locationManagerDidResumeLocationUpdates(_ manager: CLLocationManager) {
print("location manager did resume")
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Location fetch failed with error : \(error.localizedDescription)")
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
print("Authorization Changed")
}
}
チャームのように働いた!ありがとう –