我的情况如下。
var hotelType: String = "test"
hotelType==hotelInfo.type!
让我们假设hotelInfo
具有如下结构。
struct HotelInfo : Decodable {
var type: String?
}
当应用程序崩溃时说hotelType
为nil,我更新了如下代码。
hotelType==(hotelInfo.type!==nil ? "" : hotelInfo.type!)
然而,应用程序仍然崩溃,显示致命错误:在解包可选值时意外发现nil
在检查实际数据之前,有没有方法可以检查nil。
注:,我有替代的解决方案(它也工作得很好),但我确信这是错误的。我要做的是添加另一个变量,使空字符串为空,如下所示,并检查这个变量。
struct HotelInfo : Decodable {
var type: String?
var typeFixed: String? {
get {
if (self.type==nil) {
return ""
}
return self.type
}
}
}
使用此变量(&U)
hotelType==hotelInfo.typeFixed!
最重要的
我在过滤器中这样做,所以我不能使用if let
语句(这是实际的代码,但我给出了上面的简单逻辑,因为数据非常复杂)
finalArray = finalArray.filter { hotels in
hotels.infos?.contains { roomInfo in
selectedChain.contains { rt in
rt == (roomInfo.hotelChain?.supplierHotelChain!==nil ? "" : roomInfo.hotelChain?.supplierHotelChain!)
}
} ?? false
}
rt == (roomInfo.hotelChain?.supplierHotelChain!==nil ? "" : roomInfo.hotelChain?.supplierHotelChain!)
这就是我检查条件的地方。
有没有人能给我指出正确的方向,以获得所需的数据。
发布于 2018-06-03 04:19:51
是,这仍然会崩溃,因为您在检查它是否是nil
之前强制解开hotelInfo.type
hotelType==(hotelInfo.type!==nil ? "" : hotelInfo.type!)
你已经完成了:
hotelType == (hotelInfo.type == nil ? "" : hotelTypeInfo.type!)
它会起作用的。
相反,请使用nil coalescing operator ??
hotelType == (hotelInfo.type ?? "")
在您的filter语句中:
finalArray = finalArray.filter { hotels in
hotels.infos?.contains { roomInfo in
selectedChain.contains { rt in
rt == (roomInfo.hotelChain?.supplierHotelChain ?? "")
}
} ?? false
}
https://stackoverflow.com/questions/50660754
复制相似问题