将现有的obj c代码移植到swift - 在展开Optional值时意外地发现了nil

时间:2015-03-14 10:04:44

标签: objective-c xcode swift mapkit mkannotation

我正在尝试在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;
        }

1 个答案:

答案 0 :(得分:2)

强迫演员" as MKPinAnnotationView(对于非可选类型)将因运行时异常而中止 如果mapView.dequeueReusableAnnotationViewWithIdentifier()返回nil

您可以使用可选的广告as?代替:

annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier("cluster")
                      as? MKPinAnnotationView
在这种情况下,

会将nil分配给annotationView

如果可以保证重用队列中的所有元素都具有该类型 MKPinAnnotationView然后转换为隐式解包的可选 也会起作用:

annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier("cluster")
                      as MKPinAnnotationView!

但第一个版本更安全。