CLLocation2D没有从变量分配值

时间:2018-08-04 14:59:02

标签: ios arrays swift cllocation

我从Firebase获取纬度和经度的值,并将其存储为String到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

recombinedCoordinate CLLocationCoordinate2D?无(来自错误行)。

然后从控制台获得以下打印结果:

fir aLongitudeArray [“ -122.0312186”]

fir aLatitudeArray [“ 37.33233141”]

为什么不分配值?

2 个答案:

答案 0 :(得分:0)

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

此行声明一个变量,并告诉Swift:嘿,目前我尚未初始化它,但是我要初始化它,相信我。
var recombinedCoordinate: CLLocationCoordinate2D!

但是,接下来,您正在尝试设置该实例的变量。
recombinedCoordinate.latitude = stringedLatitude

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

如果您编写了CLLocationCoordinate2D?,则XCode稍后会告诉您,此调用是不安全的,或者,在看到该属性为nil后,就不会尝试设置该属性。


要解决您的问题,我只需编写以下内容:

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

此外,我建议您改善变量命名。 “ stringedLatitude”和“ stringeLongitude”毫无意义,因为它们实际上是Double类型。

最后,我会避免使用.doubleValue,请参见https://stackoverflow.com/a/32850058/3991578

答案 1 :(得分:0)

您需要像这样初始化它

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

如此

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