【问题标题】:Swift Extensions from Objective-C Protocol来自 Objective-C 协议的 Swift 扩展
【发布时间】:2016-06-11 01:30:26
【问题描述】:

所以我正在使用一个使用 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! {}
}

当我这样做时,我收到以下错误: 方法mapView(_:viewForAnnotation:)提供的Objective-C方法mapView:viewForAnnotation:与协议MKMapViewDelegate中的可选要求方法mapView(_:viewForAnnotation:)冲突

我不知道如何通过这个...有人吗?

谢谢,

【问题讨论】:

  • 不幸的是,这在 Objective C 中是合法的。有没有办法解决这个问题?我们最初的应用程序是在 Objective-C 中的,这一切都很好。
  • 那么有没有办法让我告诉它这是我要处理的一个,而另一个可以忽略?

标签: objective-c swift delegates protocols


【解决方案1】:

问题是这个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 中。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 其实很聪明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多