如何按用户距离对Business对象数组进行排序?

时间:2016-07-02 20:56:11

标签: ios swift sorting

我有以下数据加载了企业:

var businessesArray = [Business]()

现在每个商家都有纬度和经度属性:

private var _latitude: Double
private var _longitude: Double

最有效的方式(使用swift)对businessArray进行排序是通过将业务最接近用户放在最后并且距离用户最远(从最近到最远排序)?假设我已经拥有用户在这些变量中的当前位置:

var currentUserLatitude: Double
var currentUserLongitude: Double

3 个答案:

答案 0 :(得分:3)

鉴于此结构(您也可以使用类)

struct Business {
    let latitude: Double
    let longitude: Double

    var location: CLLocation {
        return CLLocation(latitude: latitude, longitude: longitude)
    }
}

用户位置

var currentUserLatitude: Double = ...
var currentUserLongitude: Double = ...
let userLocaton = CLLocation(
    latitude: currentUserLatitude,
    longitude: currentUserLongitude
)

以及地点列表

let places: [Business] = ...

这是你对它们进行排序的方式

let sortedPlaces = places.sort {
    userLocaton.distanceFromLocation($0.0.location) < userLocaton.distanceFromLocation($0.1.location)
}

或者如果您更喜欢扩展符号代码

let sortedPlaces = places.sort { (left, right) -> Bool in
    userLocaton.distanceFromLocation(left.location) < userLocaton.distanceFromLocation(right.location)
}

它是如何工作的?

sort方法接受闭包。

在此闭包内,您必须指定排序逻辑。更具体地说,给定2 Business个值leftright,如果left在最终排序中应放在right之前,则闭包返回true }。否则false

答案 1 :(得分:1)

您可以使用CLLocation课程及其distanceFromLocation方法计算与当前位置的距离。

扩展业务模式

extension Business {
    var location: CLLocation {
        return CLLocation(latitude: self.latitude, longitude: self.longitude)
    }
}

对地点数组进行排序

let userLocaton = CLLocation(latitude: currentUserLatitude, longitude: currentUserLongitude)

let sortedPlaces = places.sort { (left, right) -> Bool in 
  userLocation.distanceFromLocation(left.location) < userLocation.distanceFromLocation(right.location))
}

答案 2 :(得分:0)

Inside Business创建一个像这样的计算变量

var distanceFromUser: Double {
    return pow((userLat - _latitude), 2) + pow((userLon - _longitude), 2)
}

然后你有你的企业阵列调用

businessesArray.sort({ $0.distanceFromUser < $1.distanceFromUser})

我知道地球并不平坦,但毕达哥拉斯定理仍然按预期运作。你永远不需要取平方根,因为很明显,如果一个&gt; b然后sqrt(a)&gt; sqrt(b),你不必采取abs,因为他们为你做了它:)