c’est mon code.getting cet EXC_BAD_ACCESS (code = EXC_i386_GPFLT) .Je ne sais pas comment trouver et résoudre les problèmes plz, aidez-moi ... l'application se bloque lors de l'obtention de la longitude
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)
Réponse courte:
activer les zombies dans le schéma et il va permettre un point d'arrêt et la raison appropriée sera affichée dans les journaux
Raison technique:
Vous essayez de faire quelque chose qui n’est pas autorisé dans l’architecture Reportez-vous à ceci Que signifie le code d’exception "EXC_I386_GPFLT"?
Votre problème ici est que la plupart des opérations que vous effectuez peuvent renvoyer nil, ce qui plantera Swift si vous essayez de l’utiliser comme valeur non nulle. Vous devez être explicite sur le fait de tester nil. La façon de sledgehammer de le faire serait
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")
}
... mais c'est moche. Comme cette routine peut ou ne peut pas trouver aucune des clés, à la fin vous pouvez ou non avoir une paire de coordonnées valide. C'est exactement ce que sont les options. Pensez à la réécrire sous forme de fonction renvoyant une valeur facultative:
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
}
Ceci utilise un chaînage facultatif (?
) pour réduire les tests, mais nous devons le casser à geometry
car nous avons besoin pour être un tableau, car nous devons accéder à un élément spécifique de celui-ci (et, bien sûr, teste que ce n'est pas un tableau vide!)
p.s. - ironiquement, votre test sur error != nil
ne fait rien car vous n'avez pas envoyé error
à la routine JSONObjectWithData.
Dans ce type de situation, vous pouvez convertir latitude en chaîne. Code mis à jour:
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)