Swift 2从值中查找变量名
我有一个函数,可以找到一些预先确定的位置与当前位置最近的位置。我得到了结果值,但我想要的是名称。在本例中,它将是“Larkspur”Swift 2从值中查找变量名,swift,variables,Swift,Variables,我有一个函数,可以找到一些预先确定的位置与当前位置最近的位置。我得到了结果值,但我想要的是名称。在本例中,它将是“Larkspur” 您应该使用dict[String:CLLocationDistance]而不是数组,这样您可以获得字符串值和距离: let distances = [ "Larkspur": locationCurrent.distanceFromLocation(locationLarkspur) // ... ] 您必须重写代码以找到最小距离,但它会给您想要
您应该使用dict
[String:CLLocationDistance]
而不是数组,这样您可以获得字符串值和距离:
let distances = [
"Larkspur": locationCurrent.distanceFromLocation(locationLarkspur)
// ...
]
您必须重写代码以找到最小距离,但它会给您想要的。这基本上是gfpacheco对答案的扩展 代码是面向函数式编程的 1.创建一个字典,其中
是位置的名称(一个键
)字符串
值是位置的位置(
)CLLocation
let coordinates = [
"Larkspur": CLLocation(latitude: 37.944804, longitude: -122.509066),
"Saulsalito": CLLocation(latitude: 37.856315, longitude: -122.478723),
"SanFrancisco": CLLocation(latitude: 37.795346, longitude: -122.392711),
"Fishermans": CLLocation(latitude: 37.809166, longitude: -122.412012),
"Giants": CLLocation(latitude: 37.778304, longitude: -122.387754),
"Tiburon": CLLocation(latitude: 37.872928, longitude: -122.455806),
"Vallejo": CLLocation(latitude: 38.100116, longitude: -122.262378),
"Alameda": CLLocation(latitude: 37.790633, longitude: -122.293910),
"HarborBay": CLLocation(latitude: 37.736799, longitude: -122.256810),
"JackLondon": CLLocation(latitude: 37.795287, longitude: -122.279601),
"SouthSF": CLLocation(latitude: 37.662428, longitude: -122.377791)
]
2.定义“此处”
3.创建一个新的距离字典
4.找到最近的
let latest=distance.minElement{$0.1<$1.1}?.0
现在,
最近的
确实包含最近位置的名称。这里有一个稍微不同的用法,使用自定义结构保存位置信息:
import CoreLocation
// Create a custom structure to hold place names, latitude, and longitude
struct Location {
var name: String
var latitude: Double
var longitude: Double
}
let lat = 37.941053
let long = -122.483915
let locations: [Location] = [
Location(name: "Larkspur", latitude: 37.944804, longitude: -122.509066),
Location(name: "Saulsalito", latitude: 37.856315, longitude: -122.478723),
Location(name: "SanFrancisco", latitude: 37.795346, longitude: -122.392711),
Location(name: "Fishermans", latitude: 37.809166, longitude: -122.412012),
Location(name: "Giants", latitude: 37.778304, longitude: -122.387754),
Location(name: "Tiburon", latitude: 37.872928, longitude: -122.455806),
Location(name: "Vallejo", latitude: 38.100116, longitude: -122.262378),
Location(name: "Alameda", latitude: 37.790633, longitude: -122.293910),
Location(name: "HarborBay", latitude: 37.736799, longitude: -122.256810),
Location(name: "JackLondon", latitude: 37.795287, longitude: -122.279601),
Location(name: "SouthSF", latitude: 37.662428, longitude: -122.377791)
]
let currentLocation = CLLocation(latitude: lat, longitude: long)
// Use map to create an array of named tuple pairs with distance and location name
let distances:[(distance: Double, name: String)] = locations.map { (CLLocation(latitude: $0.latitude, longitude: $0.longitude).distanceFromLocation(currentLocation), $0.name) }
let closest = distances.minElement {$0.distance < $1.distance}!
print("Closest location is \(closest.name) at a distance of \(closest.distance)")
导入核心位置
//创建自定义结构以保存地名、纬度和经度
结构位置{
变量名称:String
纬度:双
经度:双
}
设lat=37.941053
设long=-122.483915
出租位置:[位置]=[
位置(名称:“Larkspur”,纬度:37.944804,经度:-122.509066),
位置(名称:“索尔萨利托”,纬度:37.856315,经度:-122.478723),
位置(名称:“旧金山”,纬度:37.795346,经度:-122.392711),
地点(姓名:“渔民”,纬度:37.809166,经度:-122.412012),
位置(名称:“巨人”,纬度:37.778304,经度:-122.387754),
位置(名称:“蒂布隆”,纬度:37.872928,经度:-122.455806),
位置(名称:“Vallejo”,纬度:38.100116,经度:-122.262378),
位置(名称:“阿拉米达”,纬度:37.790633,经度:-122.293910),
位置(名称:“海港”,纬度:37.736799,经度:-122.256810),
位置(名称:“杰克伦敦”,纬度:37.795287,经度:-122.279601),
位置(名称:“南SF”,纬度:37.662428,经度:-122.377791)
]
让currentLocation=CLLocation(纬度:纬度,经度:长)
//使用“映射”创建一个命名元组对数组,该数组具有距离和位置名称
让距离:[(距离:双精度,名称:字符串)]=locations.map{(CLLocation(纬度:$0.lation,经度:$0.longitude).distanceFromLocation(当前位置),$0.name)}
设最近距离=distance.minElement{$0.distance<$1.distance}!
打印(“最近的位置是\(最近的.名称),距离\(最近的.距离)”)
您的最近的计算需要工作。它总是返回Alameda
。最接近的计算是得到最小键(总是Alameda)。您应该计算最小值,而不是返回它的键,而不是好的答案。使用自定义的位置结构
使代码更具可读性,并允许您将数据存储在数组
中,而不是字典
中。不错的选择。
let here = CLLocation(latitude: 12.3, longitude: 12.3)
let distances = coordinates.enumerate().reduce([String:CLLocationDistance]()) { (var accumulator, elm) -> [String:CLLocationDistance] in
accumulator[elm.element.0] = elm.element.1.distanceFromLocation(here)
return accumulator
}
let closest = distances.minElement { $0.1 < $1.1}?.0
import CoreLocation
// Create a custom structure to hold place names, latitude, and longitude
struct Location {
var name: String
var latitude: Double
var longitude: Double
}
let lat = 37.941053
let long = -122.483915
let locations: [Location] = [
Location(name: "Larkspur", latitude: 37.944804, longitude: -122.509066),
Location(name: "Saulsalito", latitude: 37.856315, longitude: -122.478723),
Location(name: "SanFrancisco", latitude: 37.795346, longitude: -122.392711),
Location(name: "Fishermans", latitude: 37.809166, longitude: -122.412012),
Location(name: "Giants", latitude: 37.778304, longitude: -122.387754),
Location(name: "Tiburon", latitude: 37.872928, longitude: -122.455806),
Location(name: "Vallejo", latitude: 38.100116, longitude: -122.262378),
Location(name: "Alameda", latitude: 37.790633, longitude: -122.293910),
Location(name: "HarborBay", latitude: 37.736799, longitude: -122.256810),
Location(name: "JackLondon", latitude: 37.795287, longitude: -122.279601),
Location(name: "SouthSF", latitude: 37.662428, longitude: -122.377791)
]
let currentLocation = CLLocation(latitude: lat, longitude: long)
// Use map to create an array of named tuple pairs with distance and location name
let distances:[(distance: Double, name: String)] = locations.map { (CLLocation(latitude: $0.latitude, longitude: $0.longitude).distanceFromLocation(currentLocation), $0.name) }
let closest = distances.minElement {$0.distance < $1.distance}!
print("Closest location is \(closest.name) at a distance of \(closest.distance)")