我从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”]
为什么不分配值?
答案 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