在表上显示排序结果-Swift4

时间:2018-11-06 19:58:03

标签: ios swift uitableview tableview

我有

包含这些内容的地方

print(places)

Optional(Results<Place> <0x109526f30> (
    [0] Place {
        name = 127 Pine St;
        country = United States;
        lat = 42.63341130000001;
        lon = -71.33169049999999;
    },
    [1] Place {
        name = 138 B St;
        country = United States;
        lat = 42.6285025;
        lon = -71.3288776;
    },
    [2] Place {
        name = 16 Bagley Ave;
        country = United States;
        lat = 42.6344084;
        lon = -71.3378318;
    },
    [3] Place {
        name = 27 Lane St;
        country = United States;
        lat = 42.6346452;
        lon = -71.32436559999999;
    },
    [4] Place {
        name = 39 Cosgrove St;
        country = United States;
        lat = 42.61964890000001;
        lon = -71.3031683;
    },
    [5] Place {
        name = 48 Houghton St;
        country = United States;
        lat = 42.6252232;
        lon = -71.3243308;
    },
    [6] Place {
        name = 49 Coral St;
        country = United States;
        lat = 42.6359846;
        lon = -71.32655780000002;
    },
    [7] Place {
        name = 59 Marriner St;
        country = United States;
        lat = 42.622121;
        lon = -71.31365679999999;
    }
)) <<<

我在内存中还维护着另一个像这样的数组

 print(distances)
 ["1.74", "1.45", "2.04", "1.50", "0.00", "1.15", "1.64", "0.56"]

结果

我的最终结果看起来像这样。

enter image description here


代码

这就是我渲染此表的方式

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "customPlaceDetailCell", for: indexPath)
     as! CustomPlaceDetailCell

    if selectedPlace.name != nil {

        cell.address.text = (places![indexPath.row]["name"] as! String)
        cell.distance.text = distances[indexPath.row]

        if indexPath.row == activePlace {
            cell.address.isHidden = true
            cell.distance.isHidden = true
        }

    }

    return cell
}

我想要

显示我的结果是按距离更近的距离


注意:我的距离不属于我的places对象。我在运行时计算了它们。

如何去做呢?

2 个答案:

答案 0 :(得分:2)

计算点之间的距离非常昂贵。您应该只执行一次,或者如果您的数据发生更改。 排序很昂贵。您应该只执行一次,或者如果您的数据更改。

尝试对2个不同的数组进行排序是个坏主意。

排序将数组中的项目进行多次比较。您需要一个保存距离的位置,以便可以对位置进行排序。

使您的Place对象成为具有方法和属性的Struct,而不是Dictionary

我会向您的数组添加一个计算的距离属性。还要添加一个internalDistance的{​​{1}}属性。

使计算出的距离属性的getter返回Optional(如果不为零),或者计算距离,将其保存到internalDistance,然后返回其为nil。

如果您更改目的地,请遍历场所数组并淘汰所有internalDistance变量,然后对场所数组进行重新排序。

答案 1 :(得分:0)

这样的事情应该是一种可能性。

override func viewDidAppear(_ animated : Bool){
super.viewDidAppear(animated)
 placeArray = zip(places,distance).sorted{$0.1<$1.1}.map{$0.0}
}

cell.address.text = (placeArray![indexPath.row]["name"] as! String)


如果您希望使用另一种方法可能更快,则可以按以下方式对距离进行排序:

placeArray = distance.enumerated().sorted{$0.element<$1.element}.map{places[$0.offset]}

这需要一种距离作为索引。