Подтвердить что ты не робот

Подклассификация MKGeodesicPolyline

Я пытаюсь подклассы MKPolyline и MKGeodesicPolyline хранить свои отдельные цвета (путем экземпляров подкласса возвращать свои собственные MKPolylineRenderer). Он отлично работает для MKPolyline, но экземпляры моего подкласса MKGeodesicPolyline не являются подклассами - просто MKGeodesicPolyline s. Может ли кто-нибудь объяснить, почему? Здесь мой код...

protocol MapLineProtocol: MKOverlay {
    var width: CGFloat { get set }
    var colour: UIColor { get set }
}
extension MapLineProtocol {
    var renderer: MKPolylineRenderer {
        let polylineRenderer = MKPolylineRenderer(overlay: self)
        polylineRenderer.strokeColor = self.colour
        polylineRenderer.lineWidth = self.width
        return polylineRenderer
    }
}
class MapLine: MKPolyline, MapLineProtocol {
    var width: CGFloat = 3
    var colour: UIColor = .blue
    convenience init(start: CLLocationCoordinate2D, end: CLLocationCoordinate2D) {
        let line = [start, end]
        self.init(coordinates: line, count: line.count)
    }
}
class MapGeodesic: MKGeodesicPolyline, MapLineProtocol {
    var width: CGFloat = 3
    var colour: UIColor = .red
    convenience init(start: CLLocationCoordinate2D, end: CLLocationCoordinate2D) {
        let line = [start, end]
        self.init(coordinates: line, count: line.count)
    }
}

let mapLine = MapLine(start: loc.coordinate, end: end)
print("Mapline subclass: \(mapLine)") // <Appname.MapLine: xxx>
self.mapView.add(mapLine)
let geoLine = MapGeodesic(start: loc.coordinate, end: end)
print("Geodesic subclass: \(geoLine)") // <MKGeodesicPolyline: xxx> !!!
self.mapView.add(geoLine)

Доступ к свойству .colour на mapLine прекрасен (и работает рендер), но доступ к .colour в geoLine вызывает исключение во время выполнения (и, конечно, средство визуализации не работает, если вы обход цвета). Может кто-нибудь объяснить?

4b9b3361

Ответ 1

Я не могу уловить точную проблему.. но на основе моего анализа.. MKGeodesicPolyline унаследована от MKPolyline. Поэтому, когда вы инициализируете MKGP, также инициализируется родительский MKP, из-за этого использование Convenience Init делает некоторые беспорядки, я думаю.