繁体   English   中英

来自Objective-C协议的Swift扩展

[英]Swift Extensions from Objective-C Protocol

所以我正在使用利用MKMapView的Objective-C库。 所以有一个类:

 @interface BSWeatherMapView : MKMapView
    /** The receiver’s delegate. */
    @property (nonatomic, weak) id<BSWeatherMapViewDelegate> delegate; 

使用以下方法定义其协议:

    @protocol BSWeatherMapViewDelegate<MKMapViewDelegate>
    @optional 
    - (MKAnnotationView *)mapView:(BSWeatherMapView *)mapView viewForAnnotation:(id<MKAnnotation >)annotation;

我的swift课程有一个扩展程序,可以执行以下操作:

extension ViewController : BSWeatherMapViewDelegate {
func mapView(mapView: BSWeatherMapView!, viewForAnnotation annotation: AnyObject) -> MKAnnotationView! {}
}

当我这样做时,出现以下错误:Objective-C方法mapView:viewForAnnotation:由方法mapView(_:viewForAnnotation:)提供,与协议MKMapViewDelegate可选需求方法mapView(_:viewForAnnotation:)冲突

我不知道该如何克服...任何人?

谢谢,

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

@protocol BSWeatherMapViewDelegate<MKMapViewDelegate>
@optional 
- (MKAnnotationView *)mapView:(BSWeatherMapView *)mapView viewForAnnotation:(id<MKAnnotation >)annotation;
@end

非法之处在于MKMapViewDelegate已经声明了一个名为mapView:viewForAnnotation:的方法,但具有不同的第一个参数类型。 Objective-C中没有重载,因此无法区分MKMapViewDelegate mapView:viewForAnnotation:和BSWeatherMapViewDelegate mapView:viewForAnnotation: :。 如果同一个应用尝试同时实现这两个应用,则运行时将无法知道哪个是哪个。

只要您不尝试实现这两种方法,Objective-C编译器就不会真正阻止您。 发出警告,但不会出错 (你,而在Objective-C编写的应用程序,都可能被轻率地忽略了警告,但是这是一个错误,因为它会避让你到你麻烦已经事实。)如果你试图实施两者都将导致“重复声明”编译错误。

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

因此,您的选择是:

  • 放弃使用此库,因为它有问题。

  • 将库修复为合法(假设您有权访问源)。 例如,更改BSWeatherMapViewDelegate方法的名称,无论它在哪里发生。

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

不幸的是,我暂时无法更改该库,也无法移至其他库。 我最终要做的是创建了一个Objective-C类,该类是BSWeatherMapViewDelegate的委托。 然后,我创建了每个委托方法都调用的类似方法。 最后,我迅速将这个中间Obj-C类子类化,并覆盖了中间方法。 这不是理想的解决方案,但可以完成工作。 感谢您的所有建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM