Tôi đang cố gắng phân lớp MKPolyline
và MKGeodesicPolyline
để 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?
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. –
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