我们都知道swift对?和!的要求十分严格,那这也导致了和Objective-C的一些不同,例如高德地图API中是这样定义的
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation
{
if ([annotation isKindOfClass:[MAPointAnnotation class]])
{
static NSString *reuseIndetifier = @"annotationReuseIndetifier";
MAAnnotationView *annotationView = (MAAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIndetifier];
if (annotationView == nil)
{
annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:reuseIndetifier];
}
annotationView.image = [UIImage imageNamed:@"restaurant"];
//设置中心点偏移,使得标注底部中间点成为经纬度对应点
annotationView.centerOffset = CGPointMake(0, -18);
return annotationView;
}
return nil;
}
我们在swift里面写的时候,如果不是直接复制高德地图API中的代码的话,容易出现这个问题
那就是每次初始化的时候总是报nil的错误,具体错误出在哪里呢?
var annotationView: MAAnnotationView**?** = mapView.dequeueReusableAnnotationView(withIdentifier: pointReuseIndetifier)
if annotationView == nil {
annotationView = MAAnnotationView(annotation: annotation, reuseIdentifier: pointReuseIndetifier)
}
var annotationView: MAAnnotationView?
中的?非常关键,如果没有的话,那就意味着这些都一定是非空的,下面的判断为nil也变得没有意义了。
这都是细节,但是需要仔细甄别。