SWIFT 4.1无法为类型为'(String?)'的参数列表调用类型为'Double'的初始化程序

时间:2018-08-08 15:55:30

标签: ios swift firebase

我正在检索Firebase中发布的mapView批注以在地图上显示它们,但是在将纬度和经度的字符串值转换成CLLocationCoordinates2D时,我得到了错误。我不明白为什么,因为在另一个函数中,我使用相同的方法,但从数组中获取值,但没有收到错误。另外,在检索数据时,我还想使用firebase的键值作为注释的初始化程序。但是我又收到两个错误:初始化程序使用未解析的标识符“ firebaseKey”和未解析的标识符“ recombinedCoordinate”。功能如下:

func displayAlerts() {
        // FIREBASE: Reference
        ref = Database.database().reference()

        // FIREBASE:Retrieve posts and listen for changes
        databaseHandle = ref?.child("Community").child("Alert Notifications").observe(.childAdded, with: { (snapshot) in

            let data = snapshot.value as? [String:String]
            if let actualData = data {
                let dataLatitude = data!["Latitude"]
                let dataLongitude = data!["Longitude"]
                self.alertIconToDisplay = data!["Description"]

                let doubledLatitude = Double(dataLatitude)
                let doubledLongitude = Double(dataLongitude)
                var recombinedCoordinate = CLLocationCoordinate2D(latitude: doubledLatitude!, longitude: doubledLongitude!)
                print("Firebase post retrieved !")
                self.dummyFunctionToFoolFirebaseObservers()
            }
            let dataKey = snapshot.key as? String
            if let firebaseKey = dataKey {
                print("Longitude DataKey is \(String(describing: dataKey))")
                print("Longitude Actual DataKey is \(String(describing: firebaseKey))")

                self.dummyFunctionToFoolFirebaseObservers()
            }

            print("fir long \((snapshot.value!, snapshot.key))")
            userAlertAnnotation = UserAlert(type: self.alertIconToDisplay, coordinate: recombinedCoordinate, firebaseKey: firebaseKey)
            self.mapView.addAnnotation(self.userAlertAnnotation)  
        })
    } 

这是注释模型:

class UserAlert: NSObject , MKAnnotation {
    var type: String?
    var firebaseKey: String?
    var coordinate:CLLocationCoordinate2D

    init(type:String, coordinate:CLLocationCoordinate2D, firebaseKey: String) {
        self.type = type
        self.firebaseKey = firebaseKey
        self.coordinate = coordinate
    }
}

我在这里做错了什么?我知道初始化程序上的错误是因为初始化发生在键闭包中,但是然后我如何将所有数据合并到初始化程序中?

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

        let annotationView = MKAnnotationView(annotation: userAlertAnnotation, reuseIdentifier: "")    //  CHANGE FOR NEW ANNOTATION : FULL DATA

        //added if statement for displaying user location blue dot
        if annotation is MKUserLocation{
            return nil
        } else {


            annotationView.image = UIImage(named: alertIconToDisplay!)                        //    choose the image to load

            let transform = CGAffineTransform(scaleX: 0.27, y: 0.27)
            annotationView.transform = transform
            return annotationView
        }
    }



 func postAlertNotification() {

        // to set next notification id as the position it will have in array ( because first position is 0 ) we use the array.count as value


        let latitude = alertNotificationLatitude
        let longitude = alertNotificationLongitude
        let alertType = alertNotificationType

        let post: [String:String] = [//"Date" : date as! String,
                                     //"Time" : time as! String,
                                     "Latitude" : latitude as! String,
                                     "Longitude" : longitude as! String,
                                     "Description" : alertType as! String]

        var ref: DatabaseReference!
        ref = Database.database().reference()
        ref.child("Community").child("Alert Notifications").childByAutoId().setValue(post)
  }

1 个答案:

答案 0 :(得分:1)

该主题中的错误表明您无法通过可选的True创建Double。
要解决该问题,请强制解开LatitudeLongitude的值。

但是主要问题是范围问题,初始化程序中使用的所有变量都必须在相同范围内。您可以使用guard语句展平范围:

...
databaseHandle = ref?.child("Community").child("Alert Notifications").observe(.childAdded, with: { (snapshot) in

        defer { self.dummyFunctionToFoolFirebaseObservers() }
        guard let data = snapshot.value as? [String:String] else { return }
        guard let firebaseKey = snapshot.key as? String else { return }

        //                let date = data!["Date"]
        //                let time = data!["Time"]
        let dataLatitude = data["Latitude"]!
        let dataLongitude = data["Longitude"]!
        self.alertIconToDisplay = data["Description"]!

        let doubledLatitude = Double(dataLatitude)
        let doubledLongitude = Double(dataLongitude)
        let recombinedCoordinate = CLLocationCoordinate2D(latitude: doubledLatitude!, longitude: doubledLongitude!)

        print("Firebase post retrieved !")

        //                self .keyaLon = dataKey
        //                self.keyaLonArray.append(firebaseKey)

        print("Longitude Actual DataKey is \(String(describing: firebaseKey))")

        print("fir long \((snapshot.value!, snapshot.key))")
        self.userAlertAnnotation = UserAlert(type: self.alertIconToDisplay, coordinate: recombinedCoordinate, firebaseKey: firebaseKey)
        self.mapView.addAnnotation(self.userAlertAnnotation)


    })