包含这些内容的地方
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"]
我的最终结果看起来像这样。
这就是我渲染此表的方式
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对象。我在运行时计算了它们。
如何去做呢?
答案 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]}
这需要一种距离作为索引。