MKMapItem 数组中的双变量

Posted

技术标签:

【中文标题】MKMapItem 数组中的双变量【英文标题】:Double variable in MKMapItem array 【发布时间】:2018-06-12 08:43:55 【问题描述】:

我得到了一个 SearchBar,它给出了它打印在 TableView 中搜索的名称的名称。在添加搜索的键之前,我正在检查我的数据库是否获得了变量。如果我的数据库得到它,我会在 TableView 中添加搜索到的单词。我的问题是,目前matchingItems 或response.mapItems 有双变量或更多变量,并且它在TableView 中打印了很多次相同的名称。我已经尝试了很多时间来解决这个问题,但我不知道该怎么做。

错误图片 > http://i67.tinypic.com/2jfyxdf.png MKMapItem 示例

<MKMapItem: 0x6000003566e0> 
isCurrentLocation = 0;
name = "Arco di Traiano";
placemark = "Arco di Traiano, Via Traiano, 82100 Benevento, Italia @ <+41.13253257,+14.77915406> +/- 0.00m, region CLCircularRegion (identifier:'<+41.13253316,+14.77915406> radius 1414.16', center:<+41.13253316,+14.77915406>, radius:1414.16m)";
timeZone = "Europe/Rome (CEST) offset 7200 (Daylight)";
url = "http://www.comune.benevento.it/bn2_pagine/_mediagallery/pid.php?id=11";

代码如下:

var matchingItems: [MKMapItem] = []

extension LocationSearchTable : UISearchResultsUpdating 
    func updateSearchResults(for searchController: UISearchController) 

        if searchController.searchBar.text == nil || (searchController.searchBar.text?.count)! < 1 
            self.matchingItems.removeAll()
            self.tableView.reloadData()
        

        guard let mapView = mapView,
            let searchBarText = searchController.searchBar.text else  return 

        let request = MKLocalSearchRequest()
        request.naturalLanguageQuery = searchBarText
        request.region = mapView.region
        let search = MKLocalSearch(request: request)

        search.start  response, _ in
            guard let response = response else 
                return
            
            for (index , name) in response.mapItems.enumerated() 

            if (checkIfDatabaseGotThis(key: String(name.name!)) != nil)
                self.matchingItems.append(response.mapItems[index])
                self.tableView.reloadData()
            

        
    


【问题讨论】:

您能否展示一个包含重复值的数据示例?另外,你认为什么是重复的?您想要拥有唯一的名称、位置、ID 吗? 我想要唯一的名字,我放了一个bug的图像,等等 请发布实际数据,您正在使用,图像无助于找到解决方案。在您的控制台中看到MKMapItems 的示例。 我已经添加了 【参考方案1】:

已更新,因此示例按名称进行重复数据删除:

var seenNames = Set<String>()
for (index , name) in response.mapItems.enumerated() 
    let item = response.mapItems[index]
    if(checkIfDatabaseGotThis(key: String(name.name!)) != nil && !seenNames.contains(item.name))
        self.matchingItems.append(item)
        seenNames.insert(item.name)
        self.tableView.reloadData()
    

这应该会根据名称从您的项目列表中删除所有重复项。它会跟踪您看到的所有现有名称。如果该名称以前没有出现过,则将该项目添加到列表中。否则将被忽略。

【讨论】:

我已经尝试过这种方式,但它没有删除重复项:(我认为它不起作用,因为重复项获得了不同的 Hashable 值,例如 > 第一个重复 和第二个 我明白了,那么您到底认为什么是重复的?因为不同的哈希值意味着该项目没有相同的元数据。 (0x60800034ce40 部分不是哈希,是内存地址) 我的意思是我不想要具有相同名称的项目,如果您看到我在主帖中放置的屏幕截图,您就会明白我的意思。提前感谢您的宝贵时间 我已将此答案更新为基于重复数据删除。项目名称 如果您将 seenNames 声明为全局变量,代码就可以工作!谢谢!

以上是关于MKMapItem 数组中的双变量的主要内容,如果未能解决你的问题,请参考以下文章

如何摆脱扩展的“forfiles”变量中的双引号?

如何从 PHP 中的双精度数组中计算第 n 个百分位数?

数组中的双指针

使用 iOS 解析 MKMapItem

R - 基于 3 个变量的一张图表中的双箱线图

如何将子字符串命令应用于 XP cmd 脚本中的双百分比变量?