2017-09-01 11 views
12

Tôi đang cố gắng phân lớp MKPolylineMKGeodesicPolyline để lưu trữ các màu riêng của chúng (bằng cách có các cá thể phân lớp trả lại MKPolylineRenderer riêng của chúng). Nó hoạt động tốt cho MKPolyline, nhưng các trường hợp của MKGeodesicPolyline lớp con của tôi không phải là các lớp con - chỉ cần MKGeodesicPolyline s. Bất cứ ai có thể giải thích lý do tại sao? Dưới đây là mã của tôi ...Phân lớp MKGeodesicPolyline

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) 

Truy cập .colour tài sản trên mapLine được tốt (và các công trình kết xuất đồ họa), nhưng việc tiếp cận .colour trên geoLine gây ra một thời gian chạy ngoại lệ (và, tất nhiên, các renderer không hoạt động nếu bạn bỏ qua màu). Bất cứ ai có thể vui lòng giải thích?

+0

Phiên bản nhanh chóng bạn đang sử dụng? Tôi tự hỏi làm thế nào mã của bạn thậm chí có thể biên dịch. –

+1

Swift 4. Và thực sự, câu hỏi thực sự không phải là cách mã của tôi được biên dịch, nhưng MapKit có thể làm gì để phá vỡ việc kiểm tra kiểu của Swift đến nỗi chúng ta có thời gian chạy thay vì biên dịch lỗi thời gian !? – Grimxn

Trả lời

0

Không thể nắm bắt vấn đề chính xác .. nhưng dựa trên phân tích của tôi .. MKGeodesicPolyline được kế thừa từ MKPolyline. Vì vậy, khi bạn khởi tạo MKGP cũng sẽ khởi tạo MKP mẹ, do đó bằng cách sử dụng tiện lợi Init làm cho một số mess tôi nghĩ ..

+0

Tôi nghĩ đó là câu trả lời đúng. Tôi đã xem xét vấn đề này và nhận thấy rằng điều này chỉ biên dịch trong Swift 4. (Và nó không nên biên dịch vì lý do tốt) –