ios - Google Places 自动完成 Swift 3

标签 ios swift3 google-places-api google-maps-sdk-ios

我想在我的项目中集成 Google Places Autocomplete API,但我无法通过文档实现它,也无法获得 Swift-3 的一些可靠引用。有人可以帮忙吗?谢谢。

最佳答案

细节

swift 4,xCode 9

解决方案

通常的http请求。更多详情:https://developers.google.com/places/ios-api/autocomplete

完整 sample

PodFile


target 'stackoverflow-44996568' do
    use_frameworks!
    pod 'Alamofire'
    pod 'ObjectMapper'      
end

GoogleAutocompleteJSONModel


import ObjectMapper

class GoogleAutocompleteJSONModel: Mappable, CustomStringConvertible {

    public fileprivate(set) var placeId: String?
    public fileprivate(set) var reference: String?
    public fileprivate(set) var title: String?

    required convenience init?(map: Map) {
        self.init()
    }

    func mapping(map: Map) {

        title                       <- map["description"]
        placeId                     <- map["place_id"]
        reference                   <- map["reference"]
    }

    var description: String {
        return "\(toJSON())"
    }
}

Network


import Alamofire
import ObjectMapper

class Network {

    class GoogleAPI {
        class Map {

            class var googleApiKey: String {
                return "YOUR_KEY"
            }

            class func autocomplete(request: String) {
                let url = "https://maps.googleapis.com/maps/api/place/autocomplete/json?input=\(request)&components=country:us&key=\(googleApiKey)"
                Alamofire.request(url)
                    .responseJSON { response in
                        if let json = response.result.value as? [String: Any] {
                            //print("JSON: \(json)")
                            let places = Array<GoogleAutocompleteJSONModel>(json: json["predictions"])
                            let autocomplete = places.flatMap{ $0.title}
                            print("!!!! \(autocomplete)")
                        }
                }
            }
        }
    }
}

Extensions


import Foundation

extension Array where Element: Mappable {

    init(json: Any?) {
        self.init()

        var result = [Element]()
        if let array = json as? [[String: Any]] {
            for item in array {
                if let profile = Element(JSON: item) {
                    result.append(profile)
                }
            }
        }
        self = result
    }
}

ViewController


import UIKit

class ViewController: UIViewController {

    weak var searchBar: UISearchBar!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let searchBar = UISearchBar(frame: CGRect(origin: CGPoint(x: 0, y: 20), size: CGSize(width: UIScreen.main.bounds.width, height: 40)))
        searchBar.delegate = self
        view.addSubview(searchBar)
        self.searchBar = searchBar
    }
}

extension ViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        Network.GoogleAPI.Map.autocomplete(request: searchText)
    }
}

结果

enter image description here

关于ios - Google Places 自动完成 Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44996568/

相关文章:

java - 一项 Activity 中是否可以有多个 GoogleApiClient?

java - 实现 Google Places API

ios - 设置多个排序描述符

ios - 带有实时应用程序的 Facebook Review Process iOS(没有可用的模拟器构建)

iphone - 随时禁用推送通知声音

ios - 如何快速将 "2017-07-11T06:52:15.948Z"转换为类似 "JUL, 7 2017"

swift - 展开通用类型

ios - 使用 RestKit 0.20 进行 POST - NSManagedObjectContext 问题

swift3 - 在 Xcode 9 中添加共享扩展后无法为 com.xxx 设置插件占位符

android - Places API 返回 REQUEST_DENIED