当力展开时,有没有办法让一个可选项为零?

时间:2018-06-04 14:59:24

标签: swift yelp

我使用Yelp的API在地图上获取注释。我有一个填充搜索查询的表格视图,我使用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()

" Dining"我想要高级餐厅的注释,但是Yelp的类别并没有提供足够好的描述。为了解决这个问题,我只搜索了餐馆,但增加了价格限制。

添加其他注释时会出现问题。对于"快餐"和" Desserts",我不希望有价格约束,所以我传递nil(搜索时priceTiers参数可以为nil)。为了使其工作,我必须使价格成为可选,并强制将其解包在搜索参数中,从而导致错误。如果我不能使它成为一个可选项,我就无法通过。

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 :(得分:2)

"强迫展开的重点"是要声称'相信我',我知道这实际上可能是零#34;如果你错了,你的应用程序会崩溃。

所以你有问题。如果Yelp API需要非零,非空的价格数组,但您的价格为nil,则需要将nil price参数转换为可以传递给API调用的默认值

我对Yelp API一无所知,但它似乎很奇怪,它需要一个非零,非空的价格数组。

如果它允许空数组,则更改:

, priceTiers: [price!],

为:

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

如果它允许可选数组,则将其更改为:

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

如果它实际上需要非零非空数组,则提供默认值:

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

调整最后一个以正确创建一些默认价格层。