我很难让MKMapView
子类工作:
子类提供了群集功能。由于注释正在移动到具有良好动画的群集,因此提供给地图的注释必须具有coordinate
的设置器。因此,我创建了一个'子协议' MKAnnotation
:
protocol MyAnnotationProtocol: MKAnnotation {
var coordinate: CLLocationCoordinate2D { get set }
}
因此,MKMapView
的子类内部使用符合MyAnnotationProtocol
的对象。
聚类算法本身外包给另一个类。为了可重用性,算法本身适用于MKAnnotation
个对象 - 无需提供MyAnnotationProtocol
个对象。
作为注释提供给地图的具体类看起来像这样:
class MXPointAnnotation: NSObject, MyAnnotationProtocol {
var coordinate: CLLocationCoordinate2D
override init() {
coordinate = CLLocationCoordinate2D(latitude: 0, longitude: 0)
}
}
运行时,应用程序在群集算法类中的此行崩溃:
let seeds = regionQueryForAnnotation(annotation as! MKAnnotation, inMapView: mapView)
annotation
存储在NSSet
中 - 因此必须先进行投射才能使用。
日志说:
Could not cast value of type 'NSKVONotifying_********.MXPointAnnotation' (0x13402cf40) to 'MKAnnotation' (0x1a1d89ec8).
********是我的应用名称。
这对我来说似乎是一个错误,因为MXPointAnnotation
显然符合MyAnnotationProtocol
,因此符合MKAnnotation
?
让我疯狂的是,当我将MXPointAnnotation
的界面更改为:
class MXPointAnnotation: NSObject, MKAnnotation, MyAnnotationProtocol {
....
}
应用程序不会崩溃,一切都按预期工作。
请注意,MKAnnotation
的协议一致性是多余的,因为MyAnnotationProtocol
已经符合。{
这是一个当前的Swift错误还是我在这里做错了什么?