Есть ли способ разрешить опционально быть нулевым при принудительном распаковывании? - PullRequest
0 голосов
/ 04 июня 2018

Я использую API Yelp для получения аннотаций на карте.У меня есть табличное представление, заполненное поисковыми запросами, и я использую оператор switch, чтобы решить, что делать, когда один из них выбран.

case "Dining":
    self.mapView.removeAnnotations(allAnnotations)
    getAnnotations(query: "Restaurant", category: .restaurants, price: .twoDollarSigns)
    handleHideBlurView()
case "Fast Food":
    self.mapView.removeAnnotations(allAnnotations)
    getAnnotations(query: "Fast Food", category: .food, price: nil)
    handleHideBlurView()
case "Desserts":
    self.mapView.removeAnnotations(allAnnotations)
    getAnnotations(query: "Ice Cream", category: .food, price: nil)
    handleHideBlurView()

Для ячейки "Столовая" я хочу аннотации для ресторанов изысканной кухни, но категории Yelp не предоставляют ничего, что достаточно хорошо описывает это.Чтобы обойти это, я просто искал рестораны, но добавил ценовое ограничение.

Проблемы возникают при добавлении других аннотаций.Для «Фаст-фуд» и «Десерты» я не хочу, чтобы существовало ценовое ограничение, поэтому я передаю ноль (параметр priceTiers может быть нулевым при поиске).Чтобы это работало, мне пришлось сделать цену необязательной и принудительно развернуть ее в параметрах поиска, что привело к ошибке.Если я не сделаю это необязательным, я не могу пропустить ноль.

func getAnnotations(query : String, category : CDYelpBusinessCategoryFilter, price : CDYelpPriceTier?) {
    CDYelpFusionKitManager.shared.apiClient.searchBusinesses(byTerm: query, location: nil, latitude: (self.mapView.userLocation.location?.coordinate.latitude)!, longitude: (self.mapView.userLocation.location?.coordinate.longitude)!, radius: 30000, categories: [category], locale: nil, limit: 30, offset: nil, sortBy: .rating, priceTiers: [price!], openNow: nil, openAt: nil, attributes: nil, completion: { (response) in
        if let response = response {
            let businesses = response.businesses

            //print("There are \(businesses?.count) \(query) businesses")
            for business in businesses! {
                var b : CDYelpBusiness?
                b = business

                let lat = b?.coordinates?.latitude
                let long = b?.coordinates?.longitude
                let phoneNumber = (b?.phone)!

                let annotation = GetAnnotationPins(coordinate: CLLocationCoordinate2D(latitude: lat!, longitude: long!), subtitle: phoneNumber, title: (b?.name)!)

                self.mapView.addAnnotation(annotation)
            }

            self.mapView.fitAll()
        }
    })
}

Можно ли как-нибудь принудительно развернуть дополнительный файл и ожидать, что он будет нулевым?Или есть лучшее решение, чем я делаю?

1 Ответ

0 голосов
/ 04 июня 2018

Весь смысл «принудительной распаковки» состоит в том, чтобы утверждать «поверь мне, я знаю, что на самом деле это не может быть ноль».И если вы ошибаетесь, ваше приложение падает.

Итак, у вас есть проблема.Если для API Yelp требуется непустой, непустой массив цен, но ваша цена равна nil, вам необходимо преобразовать параметр цены nil в некоторое значение по умолчанию, которое можно передать вызову API.

Я ничего не знаю об API Yelp, но кажется странным, что он требует непустого, непустого массива цен.

Если он разрешает пустой массив, тогда измените:

, priceTiers: [price!],

to:

, priceTiers: price != nil ? [price!] : [],

Если он разрешает необязательный массив, измените его на:

, priceTiers: price != nil ? [price!] : nil,

Если для него действительно требуется не ноль, непустой массив,затем укажите значение по умолчанию:

, priceTiers: [price ?? CDYelpPriceTier(someDefault)],

Настройте последнее значение, чтобы правильно создать некоторый уровень цен по умолчанию.

...