Не понимаю как использовать поиск

я новичок в swift Использую YandexMapKit Задача: Нужно забить в форме такие поля как

  • страна
  • город
  • улица
  • регион
  • индекс

могу ли я вообще их получить? Да худо бедно я понял как мне использовать suggest для поиска вариантов. Но вот понять не могу как потом получить ответ в формате чтобы нужные мне поля были хотя бы подписаны!

максимум я получаю строку адреса когда ищу suggest(варианты) просмотрел демо и доку не разобрался! помогите xD


Ответы (1 шт):

Автор решения: schmidt9

Компоненты можно получить, используя следующий код (на основе класса SuggestViewController из демо)

let searchManager = YMKSearch.sharedInstance().createSearchManager(with: .combined)
var searchSession: YMKSearchSession?

let BOUNDING_BOX = YMKBoundingBox( // Москва
    southWest: YMKPoint(latitude: 55.55, longitude: 37.42),
    northEast: YMKPoint(latitude: 55.95, longitude: 37.82))
let SEARCH_OPTIONS = YMKSearchOptions()

lazy var geometry = YMKGeometry(boundingBox: BOUNDING_BOX)

// ...

func onSearchResponse(_ response: YMKSearchResponse) {

    for searchResult in response.collection.children {
        guard let obj = searchResult.obj else {
            continue
        }

        guard let objMetadata = obj.metadataContainer.getItemOf(YMKSearchToponymObjectMetadata.self) as? YMKSearchToponymObjectMetadata else {
            continue
        }

        let address = objMetadata.address

        let formattedAddress = address.formattedAddress
        let postalCode = address.postalCode ?? "none"
        let additionalInfo = address.additionalInfo ?? "none"

        print("formattedAddress", formattedAddress)
        print("postalCode", postalCode)
        print("additionalInfo", additionalInfo)

        print("components:")

        address.components.forEach {
            let value = $0.name

            $0.kinds.forEach {
                let kind = YMKSearchComponentKind(rawValue: UInt(truncating: $0))

                switch kind {

                case .country:
                    print("country: \(value)")

                case .region:
                    print("region: \(value)")

                case .locality:
                    print("locality: \(value)")

                case .street:
                    print("street: \(value)")

                case .house:
                    print("house number: \(value)")

                default:
                    break
                }
            }
        }

        print("==========")
    }
}

func onSearchError(_ error: Error) {
    let searchError = (error as NSError).userInfo[YRTUnderlyingErrorKey] as! YRTError
    var errorMessage = "Unknown error"
    if searchError.isKind(of: YRTNetworkError.self) {
        errorMessage = "Network error"
    } else if searchError.isKind(of: YRTRemoteError.self) {
        errorMessage = "Remote server error"
    }

    let alert = UIAlertController(title: "Error", message: errorMessage, preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))

    present(alert, animated: true, completion: nil)
}

@IBAction func queryChanged(_ sender: UITextField) {

    let responseHandler = {(searchResponse: YMKSearchResponse?, error: Error?) -> Void in
        if let response = searchResponse {
            self.onSearchResponse(response)
        } else {
            self.onSearchError(error!)
        }
    }

    searchSession = searchManager.submit(
        withText: sender.text!,
        geometry: geometry,
        searchOptions: SEARCH_OPTIONS,
        responseHandler: responseHandler)
}
→ Ссылка