Objective-C协议的Swift扩展

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

因此,我使用的是Objective-C库,它利用了
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中没有重载,因此无法区分MKMapViewDelegate
mapView:viewForAnnotation:
和BSWeatherMapViewDelegate
mapView:viewForAnnotation:
。如果同一个应用程序尝试实现这两种功能,那么运行时将无法知道哪个是哪个

只要您不尝试实现这两种方法,Objective-C编译器实际上不会阻止您;它发出警告,但不会出错。(你在用Objective-C编写应用程序时,可能是轻率地忽略了警告;但这是一个错误,因为这会让你意识到你已经遇到了麻烦。)如果你尝试实现这两种方法,你会得到一个“重复声明”编译错误

但是Swift编译器可以区分它们之间的区别,因为它确实允许重载,它更主动,阻止您实现它们中的任何一个。因此,您永远无法在Swift端实现它们中的任何一个

因此,您的选择是:

  • 放弃使用这个库,因为它有缺陷

  • 将库修复为合法(假设您可以访问源代码)。例如,无论BSWeatherMapViewDelegate方法出现在何处,都要更改其名称

  • 仅在Objective-C中实施这些委托方法,而不是在Swift中


问题在于此Objective-C声明是非法的:

@protocol BSWeatherMapViewDelegate<MKMapViewDelegate>
@optional 
- (MKAnnotationView *)mapView:(BSWeatherMapView *)mapView viewForAnnotation:(id<MKAnnotation >)annotation;
@end
@协议BSWeatherMapViewDelegate
@可选的
-(MKAnnotationView*)地图视图:(BSWeatherMapView*)地图视图用于注释:(id)注释;
@结束
非法之处在于,MKMapViewDelegate已经声明了一个名为
mapView:viewForAnnotation:
,但第一个参数类型不同的方法。Objective-C中没有重载,因此无法区分MKMapViewDelegate
mapView:viewForAnnotation:
和BSWeatherMapViewDelegate
mapView: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