无法转换'String?'类型的值预期参数类型'CLLocationDegrees'(又名'Double')

问题描述 投票:-2回答:3

我尝试显示帖子创建者和单元格中当前用户之间的距离。

我现在的错误是

无法转换'String?'类型的值预期参数类型'CLLocationDegrees'(又名'Double')

在以下代码中:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let lastLocation = locations.last {
        let geoCoder = CLGeocoder()

        let myLocation = CLLocation(latitude: lastLocation.coordinate.latitude, longitude: lastLocation.coordinate.longitude)

/*Here the error*/ let myBuddysLocation = CLLocation(latitude: job!.distance, longitude: job!.distance)

        let distance = myLocation.distance(from: myBuddysLocation) / 1000
        print(String(format: "The distance to my buddy is %.01fkm", distance))
    }
}

这是我的JobClass:

class Job {

var distance: String?
let ref: DatabaseReference!

init(distance: String? = nil) {
    self.distance = distance
    ref = Database.database().reference().child("jobs").childByAutoId()
}

init(snapshot: DataSnapshot){
    ref = snapshot.ref
    if let value = snapshot.value as? [String : Any] {
        distance = value["distance"] as? String
    }
}

func save() {
    let newPostKey = ref.key
            let postDictionary = [
                "distance" : self.distance!
                ] as [String : Any]
            self.ref.setValue(postDictionary)
}
}

我希望有人知道如何解决它,如果你不能添加更多代码,如果它有帮助//我是新手编码

ios swift uitableview cllocationmanager
3个回答
0
投票

错误是不言自明的:你试图设置一个String?而不是CLLocationDegrees,但你甚至可以使用Double类型。

有几种方法可以解决这个问题:

1)您可以更改类定义,如下所示:

   class Job {

          // Change distance to Double and set a default value instead of optional
          var distance: Double = 0.0
          let ref: DatabaseReference!

          // Change the init
          init(distance: Double = 0.0) {
              self.distance = distance
              ref = Database.database().reference().child("jobs").childByAutoId()
          }

          //You have to change all your distance to Double
          init(snapshot: DataSnapshot){
              ref = snapshot.ref
              if let value = snapshot.value as? [String : Any] {
                 // So change this cast
                  distance = value["distance"] as Double
              }
          }
         }

2)你可以尝试从String演员吗?加倍,但我不推荐这个。

无论如何,这是你如何做到这一点:

   if let dist = Double(job!.distance){
          let myBuddysLocation = CLLocation(latitude: dist, longitude: dist) -> Error Appears in this Line

           let distance = myLocation.distance(from: myBuddysLocation) / 1000
           print(String(format: "The distance to my buddy is %.01fkm", distance))
   }

0
投票

实际上在你的函数中唯一的问题是你传递字符串值代替double需要像这样改变。

let myBuddysLocation = CLLocation(latitude: Double.init(job!.distance) ?? 0.0, longitude: Double.init(job!.distance) ?? 0.0) 

你需要像这样改变你的功能

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let lastLocation = locations.last {
        let geoCoder = CLGeocoder()

        let myLocation = CLLocation(latitude: lastLocation.coordinate.latitude, longitude: lastLocation.coordinate.longitude)

        let myBuddysLocation = CLLocation(latitude: Double.init(job!.distance) ?? 0.0, longitude: Double.init(job!.distance) ?? 0.0) 

        let distance = myLocation.distance(from: myBuddysLocation) / 1000
        print(String(format: "The distance to my buddy is %.01fkm", distance))
    }
}

0
投票

这是正常的,因为距离应该是Double值。将其更改为:var distance: Double?应该更正它。或者将值解析为Double let myBuddysLocation = CLLocation(latitude: Double(distance)!, longitude: Double(distance)!)

我建议你避免使用!,因为如果字符串不是数字,它可能会产生致命错误,你可以使用guard来保护值,或者如果让这样的例子:

if let latitude = Double(distance) {
    let myBuddysLocation = CLLocation(latitude: latitude, longitude: latitude)
}
© www.soinside.com 2019 - 2024. All rights reserved.