2016-06-14 3 views
2

Мне нужно создать протокол, который наследуется от MKAnnotation:MKAnnotation наследование протокола

protocol Annotable: MKAnnotation { 
    ... 
} 

class Annotation: NSObject, Annotable { 
    var title: String? 
    var coordinate: CLLocationCoordinate2D 

    init(title: String, coordinate: CLLocationCoordinate2D) { 
     self.title = title 
     self.coordinate = coordinate 
    } 
} 

Там нет никаких проблем, когда я добавляю пару этих аннотаций к MAPview.

mapView.addAnnotations([Annotation(...), Annotation(...), ...] 

Но когда я пытаюсь петлю на коллекции аннотаций, приложение падениям во время выполнения:

for annotation in mapView.annotations { // fatal error: NSArray element failed to match the Swift Array Element type 
    print(annotation.title) 
} 

Мой вопрос прост: почему?

Поскольку аннотация соответствует MKAnnotation, неудивительно, что они могут быть добавлены в mapView. Так почему бы нам не получить их?

Большое спасибо!

+0

Удивление, если это останавливает крах? let pins = [Annotation (...), Annotation (...), Annotation (...), ...] .map ({$ 0 as MKAnnotation}) mapView.addAnnotations (pin) – DogCoffee

+0

Помогает ли это - I с аналогичной проблемой с картакитом и протоколами некоторое время назад. http://stackoverflow.com/questions/32237753/conform-to-protocol-mkannotation-via-custom-protocol – DogCoffee

+0

@DogCoffee карта MKAnnotation не помогает. – adauguet

ответ

2

Вы можете решить эту проблему, объявив свой протокол в качестве @objc протокола:

@objc protocol Annotable: MKAnnotation { 
    ... 
} 
+0

Спасибо! Но почему? – adauguet

+0

Отличный вопрос. Я не знаю. Мне кажется любопытным, что 'class Annotation: NSObject, Annotable {...}', где 'Annotable' соответствует' MKAnnotation', не работает, но 'class Annotation: NSObject, MKAnnotation {...}' does , – Rob

Смежные вопросы