有没有办法在强制展开时允许可选为零?
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)],
调整最后一个以正确创建一些默认价格等级。
我正在使用 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)],
调整最后一个以正确创建一些默认价格等级。