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

Port existing obj c code to swift - unexpectedly found nil while unwrapping an Optional value

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

"forced cast" as MKPinAnnotationView非可选 类型)因运行时异常而中止 如果 mapView.dequeueReusableAnnotationViewWithIdentifier() returns nil.

您可以改用可选的强制转换 as?

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

在这种情况下将 nil 分配给 annotationView

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

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

但第一个版本更安全。