this is my code.getting this EXC_BAD_ACCESS(code=EXC_i386_GPFLT).I don\'n know how to find and solve plz help me ...application getting crash when get longitude
Your problem here is that most of the operations you are performing can return nil, which will crash Swift if you try and use it as a non-nil value. You need to be explicit about testing for nil. The sledgehammer way of doing it would be
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")
}
... however that is ugly. As this routine may or may not find any of the keys, at the end you may or may not have a valid pair of coordinates. This is exactly what Optionals are for. Consider rewriting it as a function that returns an optional:
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
}
This uses Optional Chaining (?) to lessen the testing, but we have to break it at geometry because we need that to be an array, as we need to access a specific element of it (and, of course, should test that it isn't an empty array!)
p.s. - ironically, your test on error != nil does nothing, as you did not send error to the JSONObjectWithData routine.