Search for address using SWIFT

余生长醉 提交于 2019-12-02 02:35:33

You can define a local search completer:

let completer = MKLocalSearchCompleter()

And then supply the query fragment:

completer.delegate = self
completer.region = MKCoordinateRegion(center: currentCoordinate, latitudinalMeters: 10_000, longitudinalMeters: 10_000)
completer.queryFragment = "300 S Orange"

And implement the MKLocalSearchCompleterDelegate protocol

extension ViewController: MKLocalSearchCompleterDelegate {

    func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
        let addresses = completer.results.map { result in
            result.title + ", " + result.subtitle
        }

        // use addresses, e.g. update model and call `tableView.reloadData()
    }

}

And that yields:

["300 S Orange Grove Blvd, Pasadena, CA, United States",
 "300 S Orange Ave, Monterey Park, CA, United States",
 "300 S Orange St, Glendale, CA, United States",
 "300 S Orange Dr, Los Angeles, CA, United States",
 "300 S Orange Ave, Azusa, CA, United States",
 "300 S Orange Grove Ave, Los Angeles, CA, United States",
 "300 S Orange Ave, Brea, CA, United States",
 "300 S Orange Ave, Fullerton, CA, United States",
 "300 S Orange St, Orange, CA, United States",
 "300 S Orange Ave, Rialto, CA, United States",
 "300 S Orange Ave, Fallbrook, CA, United States",
 "300 S Orange St, Escondido, CA, United States",
 "300 S Orange Ave, El Cajon, CA, United States",
 "300 S Orange Cir, Tulare, CA, United States",
 "300 S Orange Ave, Exeter, CA, United States"]

Or else, you can do a local search:

let request = MKLocalSearch.Request()
request.region = MKCoordinateRegion(center: currentCoordinate, latitudinalMeters: 10_000, longitudinalMeters: 10_000)
request.naturalLanguageQuery = "300 S Pumpkin"

let formatter = CNPostalAddressFormatter()
formatter.style = .mailingAddress

let search = MKLocalSearch(request: request)
search.start { response, error in
    let addresses = response?.mapItems.compactMap { item -> String? in
        return item.placemark.postalAddress.flatMap {
            formatter.string(from: $0).replacingOccurrences(of: "\n", with: ", ")
        }
    }
    print(addresses)
}

Now, I’m using the Contacts framework’s formatter (which also exposes the postalAddress property on the placemark), but you can format these any way you want. But, assuming it finds matches, that shows something like:

["300 S Pumpkin Blvd, Los Angeles, CA  92108, United States",
 "300 S Pumpkin Pkwy, Los Angeles, CA  92103, United States",
 "300 S Pumpkin Dr, San Gabriel, CA  91776, United States"])

Now, whether you want the FormattedAddressLines, or extract the individual components from the addressDictionary is up to you, but hopefully this illustrates the idea.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!