我正在尝试在swift中使用obj c库但我遇到以下错误的问题:
fatal error: unexpectedly found nil while unwrapping an Optional value
我认为我遗漏了var annotationView:MKPinAnnotationView!
声明中的内容是错误的但无法找到方法。
代码是:
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
var annotationView:MKPinAnnotationView!
if(annotation is KPAnnotation){
var kingpinAnnotation = annotation as KPAnnotation
if (kingpinAnnotation.isCluster()){
annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier("cluster") as MKPinAnnotationView // THIS IS THE ERROR LINE
if (annotationView == nil) {
annotationView = MKPinAnnotationView(annotation: kingpinAnnotation, reuseIdentifier: "cluster")
}
annotationView.pinColor = .Purple;
} else {
annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier("pin") as MKPinAnnotationView
if (annotationView == nil) {
annotationView = MKPinAnnotationView(annotation: kingpinAnnotation, reuseIdentifier: "pin")
}
annotationView.pinColor = .Red;
}
annotationView.canShowCallout = true;
return annotationView;
}
答案 0 :(得分:2)
强迫演员" as MKPinAnnotationView
(对于非可选类型)将因运行时异常而中止
如果mapView.dequeueReusableAnnotationViewWithIdentifier()
返回nil
。
您可以使用可选的广告as?
代替:
annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier("cluster")
as? MKPinAnnotationView
在这种情况下,会将nil
分配给annotationView
。
如果可以保证重用队列中的所有元素都具有该类型
MKPinAnnotationView
然后转换为隐式解包的可选
也会起作用:
annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier("cluster")
as MKPinAnnotationView!
但第一个版本更安全。