Skip to main content
 首页 » 操作系统

objective-c之将 MKPolygon Objective-C 代码转换为 Swift

2024年01月01日32飞鱼

我有以下 Objective-C 方法:

- (void)addPolygonToMap { 
    NSInteger numberOfPoints = [self.coordinates count]; 
     
    if (numberOfPoints > 4) { 
        CLLocationCoordinate2D points[numberOfPoints]; 
        for (NSInteger i = 0; i < numberOfPoints; i++) { 
            points[i] = [self.coordinates[i] MKCoordinateValue]; 
        } 
         
        self.polygon = [MKPolygon polygonWithCoordinates:points count:numberOfPoints]; 
        [self.mapView addOverlay: self.polygon]; 
    } 
     
    self.isDrawingPolygon = NO; 
    [self.drawPolygonButton setTitle:@"draw" forState:UIControlStateNormal]; 
    self.canvasView.image = nil; 
    [self.canvasView removeFromSuperview]; 
} 

我尝试将其转换为 Swift:

func addPolygonToMap() { 
    var numberOfPoints: NSInteger = self.coordinates.count 
     
    if (numberOfPoints > 4) { 
        var points: [CLLocationCoordinate2D] = [] 
        var coordsPointer = UnsafeMutablePointer<CLLocationCoordinate2D>.alloc(numberOfPoints) 
 
        for i in 0..<numberOfPoints { 
            points.append(coordsPointer[i]) 
        } 
         
        self.polygon = MKPolygon(coordinates: &points, count: numberOfPoints) 
        self.mapView.addOverlay(self.polygon) 
         
        coordsPointer.dealloc(numberOfPoints) 
    } 
     
    self.isDrawingPolygon = false 
    self.drawPolygonButton.setTitle("Draw", forState: .Normal) 
    self.canvasView.image = nil 
    self.canvasView.removeFromSuperview() 
} 

最后,当委托(delegate)方法被调用时,它实际上并没有添加 overlay到 mapView .我什么也看不见。

我假设这是我的 self.addPolytonToMap()方法,但我不是 100% 确定。整个场景在我的 Objective-C 项目中运行良好。

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! { 
    if (overlay is MKPolygon) { 
        var overlayPathView = MKPolygonRenderer(overlay: overlay) 
        overlayPathView.fillColor = UIColor.cyanColor().colorWithAlphaComponent(0.2) 
        overlayPathView.strokeColor = UIColor.cyanColor().colorWithAlphaComponent(0.2) 
        overlayPathView.lineWidth = 5 
         
        return overlayPathView 
    } else if (overlay is MKPolyline) { 
        var overlayPathView = MKPolylineRenderer(overlay: overlay) 
        overlayPathView.strokeColor = UIColor.blueColor().colorWithAlphaComponent(0.7) 
        overlayPathView.lineWidth = 5 
         
        return overlayPathView 
    } 
     
    return nil 
} 

更新:

我刚刚注意到在我的 Objective-C 版本中,points[i].latitude一切顺利,但是当我执行以下操作时,我得到了一个奇怪的输出:

println(coordsPointer[i].latitude)

输出:

1.63041663127611e-321

1.64523860065135e-321

1.65511991356818e-321

1.68970450877706e-321

1.7045264781523e-321

1.72922976044436e-321

这可以解释为什么我没有看到 overlay , 但是我对 UnsafeMutablePointer<> 的体验是有限的。

请您参考如下方法:

通过修改 addPolygonToMap() 方法修复:

func addPolygonToMap() { 
    var numberOfPoints: NSInteger = self.coordinates.count 
 
    if (numberOfPoints > 4) { 
        var points: [CLLocationCoordinate2D] = [] 
 
        for i in 0..<numberOfPoints { 
            points.insert(self.coordinates[i].MKCoordinateValue, atIndex: i) 
        } 
 
        self.polygon = MKPolygon(coordinates: &points, count: numberOfPoints) 
        self.mapView.addOverlay(self.polygon) 
    } 
 
    self.isDrawingPolygon = false 
    self.drawPolygonButton.setTitle("Draw", forState: .Normal) 
    self.canvasView.image = nil 
    self.canvasView.removeFromSuperview() 
} 

感谢 @Volker 的帮助。