Не удается преобразовать значение типа 'String?' к ожидаемому типу аргумента «CLLocationDegrees» (он же «Double») - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь отобразить расстояние между создателем поста и текущим пользователем в ячейке.

Моя ошибка сейчас

Невозможно преобразовать значение типа '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)
}
}

Я надеюсь, что кто-то знает, как решить эту проблему, если вы не хотите, я могу добавить больше кода, если это поможет // Я новичок в кодировании

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

На самом деле в вашей функции единственная проблема в том, что вы передаете строковое значение вместо двойного, которое нужно изменить следующим образом.

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 голосов
/ 03 апреля 2019

Ошибка не требует пояснений: вы пытаетесь установить 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? в Double , но я не рекомендую это.

В любом случае, вот как вы можете это сделать:

   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 голосов
/ 03 апреля 2019

Это нормально, потому что расстояние должно быть двойным значением. Изменение на: 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)
}
...