Swift - 在 plist 的数组中搜索字典

Swift - searching through dictionaries in an array in a plist

我正在制作一个简单的应用程序,用于搜索包含地理定位的大型 plist,以及相应的纬度和经度坐标。计划是能够在搜索框中搜索这些修复,然后按下按钮定位地图视图,修复在中心,并在精确坐标处放置一个图钉。

我有界面设置,地图工作正常,只需要启用按钮来搜索用户输入的修正,return 经纬度,并将这些转发到地图。我已经在这里查看了几个小时的答案,并尝试了我发现的没有运气的版本..

这是 plist:

如您所见,修复了很多...解决此问题的最佳方法是什么?我不知道如何从这里继续。

这就是我用来定位地图的内容

func zoomToRegion() {
  let location = CLLocationCoordinate2D(latitude: 62, longitude: 16)
  let region = MKCoordinateRegionMakeWithDistance(location, 700000.0, 900000.0)

  mapView.setRegion(region, animated: true)
}

如您所见,我刚刚手动输入了纬度和经度,但它仍然有效。

我最接近让它工作的是遵循这个指南:http://rshankar.com/how-to-add-mapview-annotation-and-draw-polyline-in-swift/但是我不希望修复在地图上,直到有人搜索它们,并且我无法转换该代码做我想做的事..

感谢您对此的任何帮助或见解!

我宁愿将它们的经纬度存储为 Double,但无论如何,你应该先从那个 .plist 创建一个 NSArray (Read from .plist) 然后过滤该数组,看它是否存储了与用户输入的相同的纬度和经度值。

guard let filePath = NSBundle.mainBundle().pathForResource("YOUR_FILE_NAME", ofType: "plist"),    
let locationsArray = NSArray(contentsOfFile:filePath) else {
    print("Couldn't load .plist as an array")
    return
}

// TODO: Replace them with the actual user input
let userInputText: String = "ALABA"

// It may not contain any items
let filteredLocations = locationsArray.filter { (element) -> Bool in
    guard let title = element["title"] as? String where
      userInputText == title else { return false }
    return true
}

// To convert String lat & long to Double
let numberFormatter = NSNumberFormatter()
numberFormatter.decimalSeparator = ","

// If you only need the first result:
guard let locationDict = filteredLocations.first as? [String:AnyObject],
    let latString = location["lat"] as? String, 
    let longString = location["long"] as? String,
    let latitude = numberFormatter.numberFromString(latString)?.doubleValue,
    let longitude = numberFormatter.numberFromString(longString)?.doubleValue else {
       print("No result"); return
    }

// Your location
let location = CLLocationCoordinate2D(
    latitude: latitude, 
    longitude: longitude
)

// Do something with your location
let region = MKCoordinateRegionMakeWithDistance(location, 700000.0, 900000.0)
mapView.setRegion(region, animated: true)

但是如果你实现一个 class 会更好,比如 LocationData,具有 .plist 中给定的属性,并且你会创建一个 [LocationData] 数组,这样你就可以到达纬度和经度根据对象的属性,而不是字典中的键。