2016-06-11 6 views
0

그래서 MKMapView을 사용하는 Objective-C 라이브러리를 사용하고 있습니다. 그래서 클래스가 :Objective-C 프로토콜의 Swift Extensions

그것의 프로토콜은이 방법으로 정의된다
@interface BSWeatherMapView : MKMapView 
    /** The receiver’s delegate. */ 
    @property (nonatomic, weak) id<BSWeatherMapViewDelegate> delegate; 

:

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

내가 할 때 :

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

내 신속 클래스는 다음을 수행 확장명을 가진 다음 오류가 발생합니다. Objective-C 메서드 mapView:viewForAnnotation:mapView(_:viewForAnnotation:)이 선택적 요구 사항과 충돌합니다. 방법 mapView(_:viewForAnnotation:) in 프로토콜 MKMapViewDelegate

나는 이것을 과거에 얻는 데 아무런 단서가 없다 ... 누구?

감사합니다,

+0

이것은 객관적인 C에서 합법적입니다.이 문제를 해결할 방법이 있습니까? 우리의 원래 응용 프로그램은 Objective-C 였고이 모든 것이 정상적으로 작동했습니다. – Gamemaker945

+0

그래서 내가 처리하려고 노력하는 것이고 다른 것은 무시 될 수 있다는 것을 말해 줄 수있는 방법이 있습니까? – Gamemaker945

답변

1

문제는이 목표 - 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로 앱을 작성하는 동안 아마도 경고를 무시 무시한 것으로 보았을 것입니다. 그러나 그것은 실수였습니다. 이미 문제가 있다는 사실을 알려줄 것입니다.) 두 가지 모두를 구현하려면 "중복 선언"컴파일 오류가 발생했을 것입니다.

는하지만 허가 오버로드를 않기 때문에 그들 사이의 차이를 말할 수있는 스위프트 컴파일러는보다 적극적이고 당신은 이들 중을 구현에서 중지합니다. 따라서 은 결코 중 하나를 신속한 측면에서 구현할 수 없습니다.

당신의 선택은, 그러므로,이다 : 그것은 결함으로

  • 것은,이 라이브러리의 사용을 포기.

  • 라이브러리를 올바른 것으로 수정하십시오 (소스에 액세스 할 수 있다고 가정). 예를 들어, BSWeatherMapViewDelegate 메서드의 이름을 변경하십시오.

  • 이러한 위임 메서드는 Swift가 아닌 Objective-C에서만 구현하십시오.

1

불행히도 나는 라이브러리를 변경할 수 없으며 당분간은 다른 하나로 이동할 수 있습니다.BSWeatherMapViewDelegate의 델리게이트 인 Objective-C 클래스를 만들었습니다. 그런 다음 각 대리자 메서드가 호출하는 비슷한 메서드를 만들었습니다. 마지막으로, 신속하게,이 중간 Obj-C 클래스를 서브 클래 싱하여 중간 메서드를 오버라이드했습니다. 이상적인 해결책은 아니지만 일을 마쳤습니다. 모든 제안을 해주셔서 감사합니다.

+0

아주 영리합니다. – matt