如何将JSON中获取的信息转换为DOUBLE,以便可以正确使用该信息?

时间:2019-02-23 17:49:09

标签: json swift api call

The error that occured

The structure I put the data in

The function call that got the json information in the first place

The information sent into another structure

我正在使用智能汽车API编写联网汽车应用程序。我有一个在heroku上运行的node.js后端,以及一个在ipad上运行的Swift 4前端。

当我编译要在ipad上运行的应用程序时,它运行良好。 它经历了身份验证过程,但是发生了什么错误

线程1:EXC_BREAKPOINT(代码= 1,子代码= 0x100f16054)

在这里的第一个

var carLatitude:Double = carInfo.latitude as!双重

var carLongitude:Double = carInfo.longitude作为!双

从下面的代码中可以看到,我创建了一个名为code data的结构。然后在“ Alamofire.request(“(Constants.appServer)/ location”,“ 我得到一个json文档,并将其保存到名为“ teslaCar”的结构carData的实例

然后我将“ teslaCar”保存到“ carInfo”结构中,以将其传输到另一个视图。

然后我尝试简单地将carInfo.latitude和carInfo.longitude变成一个变量,然后将其变成双精度型。在将纬度和经度转换为两倍的世界中,我遇到了最困难的麻烦。正确传输后,我将其显示在mapkit上。

有人可以告诉我如何进行这项工作吗?

    import Alamofire
import UIKit
import SmartcarAuth
import SwiftyJSON

struct carData {
    var make: String = ""
    var model: String = ""
    var year: String = ""
    var latitude: String = ""
    var longitude: String = ""
    var odometer: String = ""
}


            Alamofire.request("\(Constants.appServer)/location", method: .get).responseJSON { response in
                switch response.result {
                case .success(let value):
                    let json = JSON(value)
                    print("JSON: \(json)")

                    let latitude = json["data"]["latitude"].stringValue
                    let longitude = json["data"]["longitude"].stringValue
                    let locationDeclaration = "Latitude: \(latitude) and Longitude: \(longitude)"
                    self.vehicleLocationText = locationDeclaration
                    print(json["data"]["latitude"])
                    print(json["data"]["longitude"])

                    self.teslaCar.latitude = latitude
                    self.teslaCar.longitude = longitude
                  /*   self.performSegue(withIdentifier: "displayVehicleInfo", sender: self)
 */
                case .failure(let error):
                    print(error)
                }


            }

        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if var destinationVC = segue.destination as? InfoViewController {
            destinationVC.carInfo = teslaCar

        }



       var carLatitude:Double = carInfo.latitude as! Double
        var carLongitude:Double = carInfo.longitude as! Double

何时

2 个答案:

答案 0 :(得分:0)

请仔细阅读错误消息。

  

String到不相关类型Double的投射始终失败。

如果您不能转换一个类型,则必须使用初始化方法来转换该类型。

还请阅读黄色警告,并考虑将未变异的 var iable声明为常量的建议

let carLatitude = Double(carInfo.latitude) ?? 0.0
let carLongitude = Double(carInfo.longitude) ?? 0.0

如果字符串值不能转换为?? 0.0,则0.0部分将分配Double

有关类型转换的更多信息,请阅读The Basics in Swift Language Guide

答案 1 :(得分:0)

This is the fixed version of the code with the changes that @vadian made. It now works This is the map function that I wrote

This is a screen shot of the operational program from the iPad thanks to @vadian's help

答案是编写此代码

       let carLatitude = Double(carInfo.latitude) ?? 0.0
    let carLongitude = Double(carInfo.longitude) ?? 0.0

        let initialLocation = CLLocation(latitude: carLatitude ?? 0.0, longitude: carLongitude ?? 0.0)

不仅需要使用方法并将要转换的变量作为参数发送,而且还需要添加?? 0.0

然后将我创建的变量传递给MapKit函数“ CLLocation”时,有必要添加一个?? 0.0

由于某种原因,您将如何将被视为Any类型的事物变成Any

就我所能描述的就是答案。有更好的方法来解释它,这就是我能说的最好的。