在Swift中键入符合子协议的转换类到父协议

时间:2015-08-15 14:36:36

标签: ios swift mkmapview mkannotation

我很难让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错误还是我在这里做错了什么?

0 个答案:

没有答案