Swift Firebase位置到地图

Swift Firebase位置到地图,swift,firebase,annotations,firebase-realtime-database,maps,Swift,Firebase,Annotations,Firebase Realtime Database,Maps,我正在尝试从firebase添加我的位置值,并将它们转换为我应用程序中的注释。这是我目前掌握的代码,它不起作用!寻找帮助的手,感觉我非常接近正确的方向,但我遇到了思维障碍 import UIKit import Firebase import MapKit class ViewController: UIViewController { @IBOutlet weak var mapView: MKMapView! let locationsRef = FIRDatabase.databas

我正在尝试从firebase添加我的位置值,并将它们转换为我应用程序中的注释。这是我目前掌握的代码,它不起作用!寻找帮助的手,感觉我非常接近正确的方向,但我遇到了思维障碍

import UIKit
import Firebase
import MapKit

class ViewController: UIViewController {

@IBOutlet weak var mapView: MKMapView!

let locationsRef = FIRDatabase.database().reference(withPath: "locations")


override func viewDidLoad() {
    super.viewDidLoad()
    locationsRef.observe(.value, with: { snapshot in
        for item in snapshot.children {
            guard let locationData = item as? FIRDataSnapshot else { continue }
            let locationValue = locationData.value as! [String: Any]

            let location = CLLocationCoordinate2D(latitude: locationValue["lat"] as! Double, longitude: locationValue["lng"] as! Double)
            let name = locationValue["name"] as! String
            self.addAnnotation(at: location, name: name)


        }
    })
}



func addAnnotation(at location: CLLocationCoordinate2D, name: String) {

    // add that annotation to the map

        let annotation = MKPointAnnotation()

        annotation.title = location["name"] as? String

        annotation.coordinate = CLLocationCoordinate2D(latitude: location["latitude"] as! Double, longitude: location["lonitude"] as! Double)

        mapView.addAnnotation(annotation)



}


}
我的代码正在运行,但我遇到了以下问题:

Could not cast value of type "NSTaggedPointerString' (0x10a708d10) to 'NSNumber' (0x109d10488).
关于这一行代码:

let location = CLLocationCoordinate2D(latitude: locationValue["lat"]   as! Double, longitude: locationValue["lng"] as! Double)
我读过一些关于将字符串转换为double的内容,但这行中没有字符串?有人能帮忙吗

更新代码字幕

更新错误


您很可能将坐标存储为Firebase数据库中的
String
对象。这是导致错误的最常见原因。在这种情况下,请尝试以下方法

let lat = Double(locationValue["lat"] as! String)
let lng = Double(locationValue["lng"] as! String)
let location = CLLocationCoordinate2D(latitude: lat, longitude: lng)
更新

数据库中的某些位置项存储为
字符串
对象,另一些存储为浮点数。你应该有一个一致的结构(即所有的都是字符串或双精度)。 无论哪种方式,这里都有一个解决您错误的方法:

var location: CLLocationCoordinate2D!

if let lat = locationValue["lat"] as? String {
    // stored as String
    let lng = Double(locationValue["lng"] as! String)!
    location = CLLocationCoordinate2D(latitude: Double(lat)!, longitude: lng)
}
else {
    // stored as a floating point number
    let lat = locationValue["lat"] as! Double
    let lng = locationValue["lng"] as! Double
    location = CLLocationCoordinate2D(latitude: lat, longitude: lng)
}
编辑2

只需在此处删除


请解释“不工作”,并提供一个JSON数据示例。您在这里工作太辛苦了-在您的方法
addAnnotation
中,您已经没有字典了,您已经有了位置和名称-只要使用这些变量,就可以为我指出正确的方向,告诉我如何根据字幕显示和隐藏注释。我想我需要创建一个表视图,其中包含三个选项“all”、“skateparks”和“street Skilling”。当我单击某个视图时,只显示那些注释