MKMapItem 地标在 swift 中不可用

Posted

技术标签:

【中文标题】MKMapItem 地标在 swift 中不可用【英文标题】:MKMapItem placemark is unavailable in swift 【发布时间】:2014-12-02 14:54:30 【问题描述】:

我目前正在尝试制作一个搜索栏,可以在用户键入时自动填充位置。我正在使用 MKLocalSearch 来获取 MKLocalSearchResponse,它似乎返回了我可以使用的值。但是,要从搜索中获取名称、地址或坐标,需要访问搜索响应中的 MKPlacemark 属性。当我访问地标时,出现错误:

'placemark' 不可用:ios7 及更早版本弃用的 API 在 Swift 中不可用

var request = MKLocalSearchRequest()
    request.naturalLanguageQuery = searchText
    //PUT HERE: check if network is on?
    let localSearch: MKLocalSearch = MKLocalSearch(request: request)
    localSearch.startWithCompletionHandler  (response: MKLocalSearchResponse!, error: NSError!) -> Void in
        if (error == nil) 
            println("searched")
            for res in response.mapItems 
                self.userSearch.append(res.placemark)
            
            self.userSearch = response.mapItems.placemark
            self.tableView?.reloadData()
         else 
            println(error)
        
    

有人知道访问地标的解决方法吗?

谢谢!

【问题讨论】:

【参考方案1】:

response.mapItems 数组在 API 中声明为 [AnyObject]! 类型。

for 循环没有明确指出 res 的类型为 MKMapItem(或者 response.mapItems 实际上是 [MKMapItem])。

所以res 被视为AnyObject 的实例,它没有被定义为具有placemark 属性。

这就是您收到编译器错误'placemark' is unavailable... 的原因。

要解决此问题,请将res 转换为MKMapItem,然后placemark 属性将变为可见。

例子:

for res in response.mapItems 
    if let mi = res as? MKMapItem 
        self.userSearch.append(mi.placemark)
    


此外,for 循环之后的这一行:
self.userSearch = response.mapItems.placemark

如果userSearch 应该是一个地标数组,则没有意义。for 循环将地标附加到该数组,然后这一行将数组设置为单个地标对象(此外,mapItems 对象甚至没有 placemark 属性)。

这行很可能应该被删除。

【讨论】:

以上是关于MKMapItem 地标在 swift 中不可用的主要内容,如果未能解决你的问题,请参考以下文章

在随机颜色数组中替换属性 CGColorGetComponents(在 swift 4 中不可用)

在 Swift 中将 CLLocation 转换为 MKMapItem

CGRectMake、CGPointMake、CGSizeMake、CGRectZero、CGPointZero 在 Swift 中不可用

“MKMapItem”类型的值在 Swift 3 中没有成员“网站”

Swift:UIButton textLabel.text 值在 switch 语句中不可用

《从零開始学Swift》学习笔记(Day 57)——Swift编码规范之凝视规范:文件凝视文档凝视代码凝视使用地标凝视