Swift - 坐标不可用:从 iOS 7 开始不推荐使用 API

Posted

技术标签:

【中文标题】Swift - 坐标不可用:从 iOS 7 开始不推荐使用 API【英文标题】:Swift - Coordinate is unavailable: APIs deprecated as of iOS 7 【发布时间】:2014-11-28 20:27:38 【问题描述】:

我正在尝试通过获取self.mapView.annotations 来遍历一组注释。

我遇到的问题是我收到一个错误,因为坐标不可用:从 iOS 7 及更早版本开始弃用的 API 对 Swift 不可用

有什么办法可以解决这个问题吗?我查看了 ios 开发人员库,但找不到任何获取每个注释坐标的方法。

var zoomRect:MKMapRect = MKMapRectNull;

for (index,annotation) in enumerate(self.mapView.annotations) 
    var annotationPoint:MKMapPoint = MKMapPointForCoordinate(annotation.coordinate)
    var pointRect:MKMapRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
    zoomRect = MKMapRectUnion(zoomRect, pointRect);


self.mapView.setVisibleMapRect(zoomRect, animated: true)

此代码的主要思想是使地图居中,以便用户能够看到所有注释。我在 Objective C 中得到了这段代码(来自 SO 的另一个问题)并将其转换为 Swift,但仍然没有运气。

【问题讨论】:

【参考方案1】:

MKMapViewannotations 属性返回 [AnyObject]!AnyObject 没有coordinate 属性。 您必须转换为 [MKAnnotation] 数组:

var zoomRect = MKMapRectNull
for annotation in self.mapView.annotations as [MKAnnotation] 
    let annotationPoint = MKMapPointForCoordinate(annotation.coordinate)
    let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1)
    zoomRect = MKMapRectUnion(zoomRect, pointRect)

(代码中的显式类型注释不是必需的,变量 循环内部实际上是常量,因此您可以使用let 声明它们。)

请注意,您可以用 reduce 操作替换 for 循环:

let zoomRect = reduce(self.mapView.annotations as [MKAnnotation], MKMapRectNull) 
    rect, annotation in
    let annotationPoint = MKMapPointForCoordinate(annotation.coordinate)
    let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1)
    return MKMapRectUnion(rect, pointRect)

【讨论】:

没错!我专注于那个错误,并试图找到annotation.coordinate 的替代品,但你说的很有道理!谢谢!

以上是关于Swift - 坐标不可用:从 iOS 7 开始不推荐使用 API的主要内容,如果未能解决你的问题,请参考以下文章

Swift IOS 使用 AVFoundation 录制视频和音频

Swift:从 iOS 7 编译存档时出现分段错误

从节点池开始GKE非常慢 - 集群和k8s / gcloud api不可用

[转]iOS地球坐标、火星坐标和百度坐标之间转换(Swift3.0)

从 swift 3.0 中删除的 C 样式语句,successor() 不可用

Swift如何检查API是不是不可用[重复]