有没有办法在强制展开时允许可选为零?

Is there a way to allow an optional to be nil when force unwrapping?

我正在使用 Yelp 的 API 在地图上获取注释。我有一个充满搜索查询的 table 视图,我正在使用 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 的类别没有提供足够好的描述。为了解决这个问题,我只是搜索了餐馆,但添加了价格限制。

添加其他注释时出现问题。对于 "Fast food" 和 "Desserts",我不希望有价格限制,所以我传递了 nil(搜索时 priceTiers 参数可以为 nil)。为了让它起作用,我不得不将价格设为可选,并在搜索参数中强制展开它,从而导致错误。如果我不让它成为可选的,我就不能传递 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()
        }
    })
}

有什么方法可以强制展开可选的并期望它为零吗?或者有没有比我现在做的更好的解决方案?

"forced unwrapping" 的全部意义在于声明 "trust me, I know this can't actually be nil"。如果你错了,你的应用程序就会崩溃。

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

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

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

, priceTiers: [price!],

至:

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

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

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

如果它确实需要一个非零、非空数组,那么提供一个默认值:

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

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