【问题标题】:How to solve this EXC_BAD_ACCESS(code=EXC_i386_GPFLT )in swift programming如何在快速编程中解决这个 EXC_BAD_ACCESS(code=EXC_i386_GPFLT)
【发布时间】:2014-09-10 07:36:52
【问题描述】:

这是我的代码。获取此 EXC_BAD_ACCESS(code=EXC_i386_GPFLT)。我不知道如何查找和解决请帮助我...应用程序在获取经度时崩溃

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) 

【问题讨论】:

  • 你没有测试 nil。我怀疑longitud(原文如此)为零。
  • 你能详细说明一下我是 swift 的新手吗
  • 您需要观看 WWDC 视频,并从 Apple 网站下载这本书。你不能用在 Stackoverflow 上提问来代替几周的认真学习。

标签: ios map swift


【解决方案1】:

简答:

在 Scheme 中启用 Zombies,它将启用断点,并在日志中显示正确的原因

技术原因:

您正在尝试做一些架构中不允许的事情 参考这个What's the meaning of exception code "EXC_I386_GPFLT"?

【讨论】:

【解决方案2】:

您的问题是您执行的大多数操作都可以返回 nil,如果您尝试将其用作非 nil 值,则会导致 Swift 崩溃。您需要明确测试 nil。这样做的大锤方式是

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")
}

...然而这很难看。由于此例程可能会或可能不会找到 任何 键,因此最终您 可能会或可能不会拥有一对有效的坐标。这正是 Optionals 的用途。考虑将其重写为返回可选值的函数:

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
}

这使用可选链 (?) 来减少测试,但我们必须在 geometry 处打破它,因为我们需要它是一个数组,因为我们需要访问特定的它的元素(当然,应该测试它不是一个空数组!)

附言- 具有讽刺意味的是,您对 error != nil 的测试什么也没做,因为您没有将 error 发送到 JSONObjectWithData 例程。

【讨论】:

  • 应该让最后一行协调吗? = ... 因为 func 可以返回 nil?
  • 它没有输入,所以我想我可以声称coordCoordinate?,但是,就我的意图而言,你是对的!!!答案变了。
【解决方案3】:

在这种情况下,您可以将纬度转换为字符串。 更新代码:

 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)

【讨论】:

    【解决方案4】:

    您收到的回复是:“http://maps.googleapis.com/maps/api/geocode/json?address=Hyderabad,india

    你可以像下面这样获取:

    这里的 jsondict 是你对 api 的回应

    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];
    

    【讨论】:

    • 如果可以的话,我想快速编码,请帮助我
    • 对位置使用浮点数会引入非常严重的舍入错误。使用双倍。
    【解决方案5】:

    使用这个:

    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) 
    

    【讨论】:

    • 如果这些键中的任何一个都不存在,那将会非常失败。你需要测试 nil。
    • 此响应来自 google api。这将由谷歌改变。我们不能改变。因此,我们还必须通过您给出答案的条件来防止可怕的失败或崩溃问题。
    猜你喜欢
    • 1970-01-01
    • 2015-12-24
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多