Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 2从值中查找变量名_Swift_Variables - Fatal编程技术网

Swift 2从值中查找变量名

Swift 2从值中查找变量名,swift,variables,Swift,Variables,我有一个函数,可以找到一些预先确定的位置与当前位置最近的位置。我得到了结果值,但我想要的是名称。在本例中,它将是“Larkspur” 您应该使用dict[String:CLLocationDistance]而不是数组,这样您可以获得字符串值和距离: let distances = [ "Larkspur": locationCurrent.distanceFromLocation(locationLarkspur) // ... ] 您必须重写代码以找到最小距离,但它会给您想要

我有一个函数,可以找到一些预先确定的位置与当前位置最近的位置。我得到了结果值,但我想要的是名称。在本例中,它将是“Larkspur”


您应该使用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)")