将现有的 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!
但第一个版本更安全。
我正在尝试在 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!
但第一个版本更安全。