Objective-C协议的Swift扩展
因此,我使用的是Objective-C库,它利用了Objective-C协议的Swift扩展,objective-c,swift,delegates,protocols,Objective C,Swift,Delegates,Protocols,因此,我使用的是Objective-C库,它利用了MKMapView。 所以有一个类: @interface BSWeatherMapView : MKMapView /** The receiver’s delegate. */ @property (nonatomic, weak) id<BSWeatherMapViewDelegate> delegate; 当我执行此操作时,会出现以下错误: Objective-C方法mapView:viewForAnno
MKMapView
。
所以有一个类:
@interface BSWeatherMapView : MKMapView
/** The receiver’s delegate. */
@property (nonatomic, weak) id<BSWeatherMapViewDelegate> delegate;
当我执行此操作时,会出现以下错误:
Objective-C方法mapView:viewForAnnotation:
由方法mapView(\uOfViewforAnnotation:)
提供的方法mapView(\uOfViewforAnnotation:)
与协议MKMapViewDelegate
我不知道如何度过这一关。。。有人吗
谢谢,问题在于此Objective-C声明是非法的:
@protocol BSWeatherMapViewDelegate<MKMapViewDelegate>
@optional
- (MKAnnotationView *)mapView:(BSWeatherMapView *)mapView viewForAnnotation:(id<MKAnnotation >)annotation;
@end
@协议BSWeatherMapViewDelegate
@可选的
-(MKAnnotationView*)地图视图:(BSWeatherMapView*)地图视图用于注释:(id)注释;
@结束
非法之处在于,MKMapViewDelegate已经声明了一个名为mapView:viewForAnnotation:
,但第一个参数类型不同的方法。Objective-C中没有重载,因此无法区分MKMapViewDelegatemapView:viewForAnnotation:
和BSWeatherMapViewDelegatemapView:viewForAnnotation:
。如果同一个应用程序尝试实现这两种功能,那么运行时将无法知道哪个是哪个
只要您不尝试实现这两种方法,Objective-C编译器实际上不会阻止您;它发出警告,但不会出错。(你在用Objective-C编写应用程序时,可能是轻率地忽略了警告;但这是一个错误,因为这会让你意识到你已经遇到了麻烦。)如果你尝试实现这两种方法,你会得到一个“重复声明”编译错误
但是Swift编译器可以区分它们之间的区别,因为它确实允许重载,它更主动,阻止您实现它们中的任何一个。因此,您永远无法在Swift端实现它们中的任何一个
因此,您的选择是:
- 放弃使用这个库,因为它有缺陷
- 将库修复为合法(假设您可以访问源代码)。例如,无论BSWeatherMapViewDelegate方法出现在何处,都要更改其名称
- 仅在Objective-C中实施这些委托方法,而不是在Swift中
@protocol BSWeatherMapViewDelegate<MKMapViewDelegate>
@optional
- (MKAnnotationView *)mapView:(BSWeatherMapView *)mapView viewForAnnotation:(id<MKAnnotation >)annotation;
@end
@协议BSWeatherMapViewDelegate
@可选的
-(MKAnnotationView*)地图视图:(BSWeatherMapView*)地图视图用于注释:(id)注释;
@结束
非法之处在于,MKMapViewDelegate已经声明了一个名为mapView:viewForAnnotation:
,但第一个参数类型不同的方法。Objective-C中没有重载,因此无法区分MKMapViewDelegatemapView:viewForAnnotation:
和BSWeatherMapViewDelegatemapView:viewForAnnotation:
。如果同一个应用程序尝试实现这两种功能,那么运行时将无法知道哪个是哪个
只要您不尝试实现这两种方法,Objective-C编译器实际上不会阻止您;它发出警告,但不会出错。(你在用Objective-C编写应用程序时,可能是轻率地忽略了警告;但这是一个错误,因为这会让你意识到你已经遇到了麻烦。)如果你尝试实现这两种方法,你会得到一个“重复声明”编译错误
但是Swift编译器可以区分它们之间的区别,因为它确实允许重载,它更主动,阻止您实现它们中的任何一个。因此,您永远无法在Swift端实现它们中的任何一个
因此,您的选择是:
- 放弃使用这个库,因为它有缺陷
- 将库修复为合法(假设您可以访问源代码)。例如,无论BSWeatherMapViewDelegate方法出现在何处,都要更改其名称
- 仅在Objective-C中实施这些委托方法,而不是在Swift中
- 不幸的是,我无法更改库,也无法暂时移动到不同的库。我最终做的是创建了一个Objective-C类,它是BSWeatherMapViewDelegate的委托。然后,我创建了每个委托方法调用的类似方法。最后,在swift中,我对这个中间Obj-C类进行了子类化,并覆盖了中间方法。这不是一个理想的解决方案,但它完成了任务。谢谢你的建议。不幸的是,我无法更改库,也无法暂时移动到其他库。我最终做的是创建了一个Objective-C类,它是BSWeatherMapViewDelegate的委托。然后,我创建了每个委托方法调用的类似方法。最后,在swift中,我对这个中间Obj-C类进行了子类化,并覆盖了中间方法。这不是一个理想的解决方案,但它完成了任务。谢谢你的建议。不幸的是,这在目标C中是合法的。有办法解决吗?我们最初的应用程序是在Objective-C中,这一切都很好。那么我有没有办法告诉它这是我正在尝试处理的一个,而另一个曾经可以忽略?不幸的是,这在Objective-C中是合法的。有没有办法解决这个问题?我们最初的应用程序是Objective-C,这一切都很好。那么有没有办法让我告诉它这是我正在尝试处理的一个,而另一个可以忽略?非常聪明,实际上。非常聪明,实际上。
@protocol BSWeatherMapViewDelegate<MKMapViewDelegate>
@optional
- (MKAnnotationView *)mapView:(BSWeatherMapView *)mapView viewForAnnotation:(id<MKAnnotation >)annotation;
@end