How to solve this EXC_BAD_ACCESS(code=EXC_i386_GPFLT )in swift programming

前端 未结 5 980
[愿得一人]
[愿得一人] 2020-12-10 18:40

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

5条回答
  •  借酒劲吻你
    2020-12-10 19:02

    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.

提交回复
热议问题