[英]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.