CLLocation2D 没有从变量中获取赋值

CLLocation2D doesn't get value assigned from a variable

我正在从 Firebase 获取纬度和经度值并将其作为字符串存储到 aLatitudeArray 和 aLongitudeArray 中。该部分运行良好,随着 Firebase 中子项的更改,数组被填充。然后我想从早期的数组重建一个 CLLocation2D 数组,但是当我将值分配给一个变量时,它得到 nil。我的功能是:

func drawAlerts() {   // to rewrite based on aLatituteArray and aLongitudeArray generated from firebase incoming data
        var alertDrawArrayPosition = 0
        while alertDrawArrayPosition != (alertNotificationArray.count - 1) {

            var firebaseAlertLatidute = aLatitudeArray[alertDrawArrayPosition]  // get String from alertLaitudeArray
            let stringedLatitude: Double = (firebaseAlertLatidute as NSString).doubleValue // converts it to Double 


            var firebaseAlertLongitude = aLongitudeArray[alertDrawArrayPosition]  // get string from alertLongitudeAray
            let stringeLongitude: Double = (firebaseAlertLongitude as NSString).doubleValue //converts it to Double

            var recombinedCoordinate: CLLocationCoordinate2D!
//
            recombinedCoordinate.latitude = stringedLatitude  // Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
            recombinedCoordinate.longitude = stringeLongitude  // Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

//            alertNotificationArray.append(recombinedCoordinate!) // Build alertNotificationArray



            alertDrawArrayPosition = ( alertDrawArrayPosition + 1 )



        }
    }

我阅读了很多帖子,但没有建议的解决方案有效。

在 运行 值是:

firebaseAlertLatidute 字符串“37.33233141”

stringedLatitude Double 37.332331410000002(转换后添加额外的 0000002)

firebaseAlertLongitude 字符串“-122.0312186”

stringeLongitude Double -122.0312186

重组坐标CLLocationCoordinate2D? nil none(这是来自错误行)。

从控制台我得到了这个打印:

fir aLongitudeArray ["-122.0312186"]

fir aLatitudeArray ["37.33233141"]

为什么不赋值?

嗯,这里没有什么大问题。你只是在声明 recombinedCoordinate 变量时使用 ! 做错了。

这一行声明了一个变量,并告诉Swift:嘿,目前我没有初始化这个,但我要初始化它,相信我。
var recombinedCoordinate: CLLocationCoordinate2D!

但是,在下一行中,您试图设置此实例的变量。
recombinedCoordinate.latitude = stringedLatitude

看到我要去哪里了吗?您尚未初始化 CLLocationCoordinate2D 实例。 recombinedCoordinate 为零。避免 nil 访问是 Swift 到处都有 Optional 类型的主要原因。

如果你写了 CLLocationCoordinate2D? XCode 稍后会告诉你,这个调用是不安全的,或者,它不会在看到它之后尝试设置 属性为零。


为了解决您的问题,我将编写以下内容:

let recombinedCoordinate: CLLocationCoordinate2D(latitude: stringedLatitude, longitude: stringeLongitude)

此外,我建议您改进变量命名。 "stringedLatitude" 和 "stringeLongitude" 没有意义,因为它们实际上是 Double 类型。

最后,我会避免使用 .doubleValue,参见

你需要像这样初始化它

let recombinedCoordinate = CLLocationCoordinate2D(latitude:stringedLatitude, longitude:stringeLongitude)

这样

var recombinedCoordinate: CLLocationCoordinate2D!
recombinedCoordinate.latitude = stringedLatitude // here recombinedCoordinate is nil as you never initiated it