在 Swift3 中存储用户位置时遇到问题

Posted

技术标签:

【中文标题】在 Swift3 中存储用户位置时遇到问题【英文标题】:Trouble storing user location in Swift3 【发布时间】:2017-08-23 20:56:34 【问题描述】:

我想要做的是传递用户位置来完成我的 JSON URL。但是我这样做的方式是打印“可选(坐标)”,我只想要坐标而不需要可选。我试图删除?,但它会在构建时标记错误。

我尝试在func locationManager 中获取用户位置,并尝试在func loadGas 中使用它们。任何帮助都可能有用。

import UIKit
import MapKit
import CoreLocation

class MapViewController: UIViewController,MKMapViewDelegate, CLLocationManagerDelegate,UICollectionViewDelegate, UICollectionViewDataSource 
    let manager = CLLocationManager()
    public let sMAGNA = "magna"
    public let sPREMIUM = "premium"
    public let sDIESEL = "diesel"
    public let MIN_TIME: CLong = 400
    private let MIN_DISTANCE: Float = 1000
    private var ubicaciones_selected: [Ubicacion] = []
    private var ubicaciones_magna: [Ubicacion]  = []
    private var ubicaciones_premium: [Ubicacion] = []
    private var ubicaciones_diesel: [Ubicacion] = []
    private let REQUEST_LOCATION = 1
    private var latlon: String = ""
    private var mType: String = "magna"
    var ubicaciones:[Ubicacion] = []
    var Ubigaspin = MKPointAnnotation()

    @IBAction func MapType(_ sender: Any) 
        if mapa.mapType == MKMapType.standard
            mapa.mapType = MKMapType.satellite
         else  mapa.mapType = MKMapType.standard
        
    

    @IBOutlet var mapa: MKMapView!
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
        let location = locations[0]
        let span:MKCoordinateSpan = MKCoordinateSpanMake(0.01, 0.01)
        let myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
        print(myLocation)
        let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span)
        mapa.setRegion(region, animated: true)
        self.mapa.showsUserLocation = true
        manager.stopUpdatingLocation()
    

    override func viewDidLoad() 
        super.viewDidLoad()

        //con esto obtendremos la ubicacion del usuario
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.requestWhenInUseAuthorization()
        mapa.showsUserLocation = true
        manager.startUpdatingLocation()

        //se cargan los pines y las gasolinas
        loadGas(tipo: mType)
    

    func loadGas(tipo:String)
        mType = tipo
        var ubicaciones:[Ubicacion] = []
        switch tipo 
        case sMAGNA:
            ubicaciones = ubicaciones_magna
        case sPREMIUM:
            ubicaciones = ubicaciones_premium
        case sDIESEL:
            ubicaciones = ubicaciones_diesel
        default:
            ubicaciones = ubicaciones_magna
        

        if ubicaciones.count == 0 
            let lat = String(describing: manager.location?.coordinate.latitude)
            let long = String(describing: manager.location?.coordinate.longitude)

            let url = URL(string: "http://192.241.214.56/api/ubicacion/?format=json&sub="+lat+","+long)
            print (url)

            //            let url = URL(string: "http://192.241.214.56/api/ubicacion/?format=json&sub=29.08919%2C-110.96133")
            //            let url = URL(string: "http://192.241.214.56/api/"+tipo+"/?format=json")
            URLSession.shared.dataTask(with: url!, completionHandler: 
                (data, response, error) in
                if(error != nil)
                    print("error")
                else
                    do
                        let ubicaciones_json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [[String : AnyObject]]

                        for ubicacion in ubicaciones_json
                            let nombre:String = ubicacion["nombre"] as! String
                            let direccion:String = ubicacion["direccion"] as! String
                            let precio_magna:Float = ubicacion["precio_magna"] as! Float
                            let precio_premium:Float = ubicacion["precio_premium"] as! Float
                            let precio_diesel:Float = ubicacion["precio_diesel"] as! Float
                            let ubicacion:String = ubicacion["ubicacion"] as! String

                            let p = Ubicacion()
                            p.ubicacion = ubicacion
                            p.setLatLng()
                            p.nombre = nombre
                            p.direccion = direccion

                            p.precio_magna = precio_magna
                            p.precio_premium = precio_premium
                            p.precio_diesel = precio_diesel

                            ubicaciones.append(p)
                        


                        self.ubicaciones = ubicaciones

                        OperationQueue.main.addOperation(
                            self.updatePins(ubicaciones: ubicaciones)
                        )

                    catch let error as NSError
                        print(error)
                    
                
            ).resume()
        else
            self.ubicaciones = ubicaciones
            self.updatePins(ubicaciones: ubicaciones)
        
    

【问题讨论】:

是否有意让您的应用在收到任何意外数据时崩溃? 代码不完整,我已经编辑过了,应该没问题 你发布的代码太多了。请将您的代码缩小到重现问题所需的部分。 好吧,对不起,我已经编辑了代码 【参考方案1】:

而不是

let lat = String(describing: manager.location?.coordinate.latitude)

你应该这样做:

guard let location = manager.location else 
    return

let lat = String(format: "%f", location.coordinate.latitude)

【讨论】:

我试过了,但是 let url 标记了一个错误,它说使用了未解析的标识符 lat 我会选择:guard let location = manager.location else return 切换到使用保护

以上是关于在 Swift3 中存储用户位置时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

存储过程 - 在 ORDER BY 列表位置 2 中遇到常量表达式

在雪花中,在授予对存储过程的“使用”访问权限时,我遇到了语法错误

传单用户位置变量

在 segue 中使用类时遇到问题

在 TableView 中实现 CoreData 时遇到问题

快速从FB获取用户信息