我有以下数据加载了企业:
var businessesArray = [Business]()
现在每个商家都有纬度和经度属性:
private var _latitude: Double
private var _longitude: Double
最有效的方式(使用swift)对businessArray进行排序是通过将业务最接近用户放在最后并且距离用户最远(从最近到最远排序)?假设我已经拥有用户在这些变量中的当前位置:
var currentUserLatitude: Double
var currentUserLongitude: Double
答案 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
个值left
和right
,如果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,因为他们为你做了它:)