Swift 2从值中查找变量名称

时间:2015-10-17 14:59:27

标签: swift variables

我有这个功能,可以找到一些预先确定的位置到当前位置的最近位置。我得到了价值,但我想要的是名字。在这个例子中,它将是“Larkspur”

 let lat = 37.941053
let long = -122.483915


let locationLarkspur = CLLocation(latitude: 37.944804, longitude: -122.509066)
let locationSaulsalito = CLLocation(latitude: 37.856315, longitude: -122.478723)
let locationSanFrancisco = CLLocation(latitude: 37.795346, longitude: -122.392711)
let locationFishermans = CLLocation(latitude: 37.809166, longitude: -122.412012)
let locationGiants = CLLocation(latitude: 37.778304, longitude: -122.387754)
let locationTiburon = CLLocation(latitude: 37.872928, longitude: -122.455806)
let locationVallejo = CLLocation(latitude: 38.100116, longitude: -122.262378)
let locationAlameda = CLLocation(latitude: 37.790633, longitude: -122.293910)
let locationHarborBay = CLLocation(latitude: 37.736799, longitude: -122.256810)
let locationJackLondon = CLLocation(latitude: 37.795287, longitude: -122.279601)
let locationSouthSF = CLLocation(latitude: 37.662428, longitude: -122.377791)
let locationCurrent = CLLocation(latitude:  lat, longitude:  long)

print(long)

let Larkspur = locationCurrent.distanceFromLocation(locationLarkspur)
let Saulsalito = locationCurrent.distanceFromLocation(locationSaulsalito)
let SanFrancisco = locationCurrent.distanceFromLocation(locationSanFrancisco)
let Fishermans = locationCurrent.distanceFromLocation(locationFishermans)
let Giants = locationCurrent.distanceFromLocation(locationGiants)
let Tiburon = locationCurrent.distanceFromLocation(locationTiburon)
let Vallejo = locationCurrent.distanceFromLocation(locationVallejo)
let Alameda = locationCurrent.distanceFromLocation(locationAlameda)
let HarborBay = locationCurrent.distanceFromLocation(locationHarborBay)
let JackLondon = locationCurrent.distanceFromLocation(locationJackLondon)
let SouthSF = locationCurrent.distanceFromLocation(locationSouthSF)



let numbers = [Larkspur, Saulsalito, SanFrancisco, Fishermans, Giants, Tiburon, Vallejo, Alameda, HarborBay, JackLondon, SouthSF]

numbers.minElement()
numbers.maxElement()

let closest = numbers.minElement()

print(closest)

3 个答案:

答案 0 :(得分:1)

这基本上是gfpacheco的答案的延伸。

代码是面向功能编程的。

1。创建一个字典

  • Key是该位置的名称(String
  • Value是该位置的位置(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。定义"此处"

let here = CLLocation(latitude:  12.3, longitude:  12.3)

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
}

4。找到最近的

let closest = distances.minElement { $0.1 < $1.1}?.0

现在closest确实包含最近位置的名称。

答案 1 :(得分:1)

这里使用自定义结构保存位置信息略有不同:

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)")

答案 2 :(得分:0)

你应该有一个dict [String:CLLocationDistance]而不是一个数组,这样你就可以获得字符串值和距离:

let distances = [
    "Larkspur": locationCurrent.distanceFromLocation(locationLarkspur)
    // ...
]

您必须重写代码才能找到最小距离,但它会为您提供所需的内容。