2016-08-24 15 views
7

Bir MKMapViewDelegate bir varsayılan uygulaması oluşturmak çalışıyorum ile '@objc' protokolünün opsiyonel gereksinimi karşılamak değildir:Sigara şöyle '@ objc' yöntemi koşullu uzantısını kullanarak koşullu uzantısı

extension MKMapViewDelegate where Self: NSObject { 
     func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
      ... 
     } 

     func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { 
      ... 
     } 
    } 
Ben kod derleme

Ancak ben uyarısını

olmayan olsun - '@ objc' yöntem '(MapView _: viewFor :)' '@objc' protokolü 'MKMapViewDelegate'

isteğe bağlı gereksinimi karşılamak değil

NSObject'e 'Benlik' konusundaki uygunluğun, uyarının gerçekleşmeyeceği anlamına geleceğini umdum. Uyarının üst kısmında temsilci örnekleri bir UIViewController olsa ve bu nedenle NSObject ile uyumlu olsa bile temsilci yöntemleri çağrılmaz.

'Nerede' uzantılarda nasıl çalıştığını yanlış anladım mı?

+1

olası çift [olmayan - '' objc' yöntem '@objc' protokol isteğe bağlı gereksinimi karşılamak değil] (http://stackoverflow.com/questions/39487168/non -objc-metot-değil-tatmin-isteğe bağlı-nesne-protokol-gereği) –

cevap

0

NSObject dolayı artık ben olsa hata nedenlerini kavramak zamanında almadığım itiraf Doug Gregor's proposal: SE-0160.

kabulüne Swift 4 itibariyle @objc anlaması edecektir. Bu cevabı sadece, sorunuzu okuyan başka birinin aşağıdaki tavsiyeyi göreceği ümidiyle gönderdim.

Tüm modülünüz için bir protokole varsayılan bir uygulama sağlamak için kötü bir uygulama veya 'kod kokusu'. 'a açıkça uyan türler arasında paylaşılabilecek bazı varsayılan davranışlarla MapViewDelegate gibi özel bir tür oluşturduğunuz alternatif bir yaklaşım öneririm.

Örneğin

:

import MapKit 
protocol MapViewDelegate: MKMapViewDelegate {} 
extension MapViewDelegate where Self: NSObject { 
    func annotationView(for annotation: MKAnnotation, in mapView: MKMapView) -> MKAnnotationView? { 
     … 
    } 

    func renderer(for overlay: MKOverlay, in mapView: MKMapView) -> MKOverlayRenderer { 
     … 
    } 
} 
final class MyMapDelegate: NSObject, MapViewDelegate { 
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
     return annotationView(for: annotation, in: mapView) 
    } 
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { 
     return renderer(for: overlay, in: mapView) 
    } 
} 
+0

Bu işlevsel bir çözüm olsa da aslında bu soruya cevap vermiyor. Soru, NSObject'e uyumun uyarılardan kurtulmamasının nedeniydi. –