este es mi código.conseguir este EXC_BAD_ACCESS(código=EXC_i386_GPFLT).No me n’saber cómo encontrar y resolver que me ayude plz …aplicación de llegar accidente cuando se obtiene la longitud

mapServerRequest="Hyderabad,india"
var mapAddress:NSString=mapServerRequest
mapAddress.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet())
     println(mapAddress)
var urlpath=NSString(format: "http://maps.googleapis.com/maps/api/geocode/json?address=%@", mapAddress)
     println(urlpath)
var url = NSURL.URLWithString(urlpath)
    println(url)
var jsonData:NSData=NSData(contentsOfURL:url)

       if(jsonData != nil)
    {
        var error:NSError=NSError(coder: nil)
        var result:NSDictionary=NSJSONSerialization .JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
        //println(result)
        if (error != nil)
        {
            mapServerResultArray=result.valueForKey("results") as NSMutableArray
           //println(mapServerResultArray)

        }
      var longitud:NSString

           longitud=mapServerResultArray.objectAtIndex(0).valueForKey("geometry").valueForKey("location").valueForKey("lng")as NSString

        var latitud :NSString = (mapServerResultArray .objectAtIndex(0).valueForKey("geometry").valueForKey("location").valueForKey("lat")) as NSString
        placeName=mapServerResultArray .objectAtIndex(0).valueForKey("formatted_address") as NSString
        var longitude:Float=longitud.floatValue
        var latitude:Float=latitud.floatValue
        self.zoomMapAndCenterAtLatitude(latitude)
        self.zoomMapAndCenterAtLongitud(longitude) 
  • No vas a probar para nada. Sospecho longitud (sic) es nula.
  • puede u plz elaborar soy nuevo en swift
  • Tendría que ver la WWDC videos y descargar el libro desde la web de Apple. No se puede reemplazar un par de semanas de graves de aprendizaje con preguntas en Stackoverflow.
InformationsquelleAutor user3541467 | 2014-07-19

5 Comentarios

  1. 3

    Su problema aquí es que la mayoría de las operaciones que va a realizar puede devolver nil, que se colgará Swift si usted intenta y lo utilizan como un no-valor nil. Usted necesita ser explícito acerca de las pruebas de nada. La demoledora forma de hacerlo sería

    let mapAddress = "Hyderabad,india"
    
    let url = NSURL.URLWithString("http://maps.googleapis.com/maps/api/geocode/json?address=\(mapAddress)")
    
    let jsonData = NSData(contentsOfURL:url)
    
    var latitude = NSNumber(double: 0.0)
    var longitude = NSNumber(double: 0.0)
    var success = false
    
    if jsonData != nil {
        if let result = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary {
            if let mapServerResultArray = result.valueForKey("results") as? NSArray {
                if let geometry = mapServerResultArray[0].valueForKey("geometry") as? NSDictionary {
                    if let location = geometry.valueForKey("location") as? NSDictionary {
                        if let lat = location.valueForKey("lat") as? Float {
                            latitude = lat
                            if let lng = location.valueForKey("lng") as? Float {
                                longitude = lng
                                success = true
                            }
                        }
                    }
                }
            }
        }
    }
    if success {
        println("Latitude = \(latitude), longitude=\(longitude)")
    } else {
        println("Failed")
    }

    … sin embargo, eso es feo. Como esta rutina puede o no puede encontrar cualquier de las claves, al final puede o no puede válida par de coordenadas. Esto es exactamente lo que son Opcionales para. Considere la posibilidad de reescribir como una función que devuelve un opcional:

    struct Coordinate { //Or use any of Cocoa's similar structs
        var latitude: Double
        var longitude: Double
    }
    
    func getCoordsOf(#address: String) -> Coordinate? {
        let url = NSURL.URLWithString("http://maps.googleapis.com/maps/api/geocode/json?address=\(address)")
        let jsonData = NSData(contentsOfURL:url)
        if jsonData == nil { return nil }
    
        let result = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
        if result == nil { return nil }
    
        if let geometry = result.valueForKey("results").valueForKey("geometry") as? NSArray {
            if geometry.count > 0 {
                let lat = geometry[0].valueForKey("location")?.valueForKey("lat")?.doubleValue
                let lng = geometry[0].valueForKey("location")?.valueForKey("lng")?.doubleValue
    
                if (lat != nil) && (lng != nil) {
                    return Coordinate(latitude: lat!, longitude: lng!)
                }
            }
        }
        return nil
    }
    
    if let coord = getCoordsOf(address: "Hyderabad,india") {
        //... do something
    }

    Este utiliza Opcional Encadenamiento (?) para disminuir la prueba, pero tenemos que romper en geometry porque nos necesidad que ser una matriz, como tenemos que acceder a un elemento específico de la misma (y, por supuesto, debe probar que no es una matriz vacía!)

    p.s. – irónicamente, la prueba en error != nil no hace nada, como no enviar error a la JSONObjectWithData rutina.

    • En caso de que la última línea se deje coord? = … como la func puede devolver nil?
    • No está escrito, así que supongo que podría reclamar coord es un Coordinate?, pero, en cuanto a mis intenciones eran de que se trate, estás en lo correcto!!! Respuesta cambiado.
  2. 1

    En ese tipo de situación se puede convertir latitud a la cadena.
    Código actualizado:

     mapServerRequest="Hyderabad,india"
        var mapAddress:NSString=mapServerRequest
        mapAddress.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet())
             println(mapAddress)
        var urlpath=NSString(format: "http://maps.googleapis.com/maps/api/geocode/json?address=%@", mapAddress)
             println(urlpath)
        var url = NSURL.URLWithString(urlpath)
            println(url)
        var jsonData:NSData=NSData(contentsOfURL:url)
    
               if(jsonData != nil)
            {
                var error:NSError=NSError(coder: nil)
                var result:NSDictionary=NSJSONSerialization .JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
                //println(result)
                if (error != nil)
                {
                    mapServerResultArray=result.valueForKey("results") as NSMutableArray
                   //println(mapServerResultArray)
    
                }
              var longitud:NSString
    
                   longitud=NSString(format:mapServerResultArray.objectAtIndex(0).valueForKey("geometry").valueForKey("location").valueForKey("lng"))
                var latitud :NSString
     latitud=NSString(format:(mapServerResultArray .objectAtIndex(0).valueForKey("geometry").valueForKey("location").valueForKey("lat")))
                placeName=NSString(format:mapServerResultArray .objectAtIndex(0).valueForKey("formatted_address"))
                var longitude:Float=longitud.floatValue
                var latitude:Float=latitud.floatValue
                self.zoomMapAndCenterAtLatitude(latitude)
                self.zoomMapAndCenterAtLongitud(longitude)
  3. -4

    Esta es la respuesta que está recibiendo :»http://maps.googleapis.com/maps/api/geocode/json?address=Hyderabad,india«

    Usted puede obtener como la siguiente:

    Aquí jsondict es su respnse de la api de

    NSArray *results = [jsonDict objectForKey:@"results"];    
    NSDictionary *geometry = [[results objectAtIndex:0] valueForKey:@"geometry"];
    NSArray *location = [geometry objectForKey:@"location"];
    float lat = [[location valueForKey:@"lat"] floatValue];    
    float lng = [[location valueForKey:@"lng"] floatValue];
    • quiero en swift codificación de si es posible hacer que me ayude plz
    • Con el flotador de una ubicación presenta muy serios errores de redondeo. Doble uso.
  4. -4

    usar este :

    var longitud:NSString =(mapServerResultArray.objectAtIndex(0).valueForKey("geometry").objectForKey("location").valueForKey("lng")) as NSString
    
    var latitud :NSString = 
    (mapServerResultArray .objectAtIndex(0).valueForKey("geometry").objectForKey("location").valueForKey("lat")) as NSString
            placeName=mapServerResultArray .objectAtIndex(0).valueForKey("formatted_address") as NSString
            var longitude:Float=longitud.floatValue
            var latitude:Float=latitud.floatValue
            self.zoomMapAndCenterAtLatitude(latitude)
            self.zoomMapAndCenterAtLongitud(longitude) 
    • Que va a fallar terriblemente si alguna de esas teclas no están allí. Usted necesita para la prueba de nil.
    • Esta respuesta viene de la api de google. esto va a cambiar por google. no podemos cambiar. Así que tenemos que evitar también horriblemente fallar o estrellarse problema a través de condiciones como las que han dado respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here