我遇到一个涉及可选项的常见错误,并且我有一个NSUserDefault
值,该值是使用位置管理器功能的用户位置:
func locationManager(manager: CLLocationManager!,
didUpdateLocations locations: [AnyObject]!)
{
//First Convert it to NSNumber.
let lat : NSNumber = NSNumber(double: latestLocation.coordinate.latitude)
let lng : NSNumber = NSNumber(double: latestLocation.coordinate.longitude)
//Store it into Dictionary
let locationDict = ["lat": lat, "lng": lng]
//Store that Dictionary into NSUserDefaults
NSUserDefaults.standardUserDefaults().setObject(locationDict, forKey: "Location")
}
当我运行我的应用程序时,它let userLoc = NSUserDefaults
在我的viewDidLoad()方法中以下代码块的行...上崩溃。
let userLoc = NSUserDefaults.standardUserDefaults().objectForKey("Location") as! [String : NSNumber]
//Grab location from that Dictionary (from func LocationManager below)
let userLat = userLoc["lat"]
let userLng = userLoc["lng"]
//declare MKPointAnnotation()
var Annotation = MKPointAnnotation()
//Convert NSNumber to CLLocationDegrees
Annotation.coordinate.latitude = userLat as! CLLocationDegrees
Annotation.coordinate.longitude = userLng as! CLLocationDegrees
错误是:
fatal error: unexpectedly found nil while unwrapping an Optional value.
我怀疑这是因为我没有存储变量
NSUserDefaults.standardUserDefaults().objectForKey("Location")
直到viewDidLoad
方法运行之后。
如何避免此错误?我应该locationManager()
在加载的视图中运行该函数吗?
我试着有一个错误...
任何帮助将不胜感激。我已经坚持了几个小时。
乔希
当您使用'!'时,请务必小心。解开可选或强制转换值。这说:“我知道这不是nil /此类的实例,如果不是,则不好,并引发异常”。
如果有可能是nil /不是所需类的实例,则应使用'?' 并适当地对结果采取行动。
if let userLoc = NSUserDefaults.standardUserDefaults().objectForKey("Location") as? [String : NSNumber] {
//Grab location from that Dictionary (from func LocationManager below)
let userLat = userLoc["lat"]
let userLng = userLoc["lng"]
//declare MKPointAnnotation()
var Annotation = MKPointAnnotation()
//Convert NSNumber to CLLocationDegrees
Annotation.coordinate.latitude = userLat as! CLLocationDegrees
Annotation.coordinate.longitude = userLng as! CLLocationDegrees
}
您第二次使用“!” -将纬度/经度分配给坐标是正确的-如果强制转换不成功,则存储的数据有问题,崩溃可能是一种合理的方法,您可以进行调试。
如果数据来自某个外部来源,并且可能无效,则使用“?” 并且某种错误处理仍可能是更好的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句