我遇到这种方法有问题;我得到一个"致命错误:在打开一个Optional值时出乎意料地发现了nil"错误。
let filtererArr = structArrayWithNoOptionals.filter({
return getFloatNumberFromPriceString(removeCommaFromPriceString($0.totalFare!)) >= minPrice && getFloatNumberFromPriceString(removeCommaFromPriceString($0.totalFare!)) <= maxPrice
})
如何修复此问题以防止崩溃?
答案 0 :(得分:2)
我总是尽量避免强行展开,在你的情况下,你可以使用guard let
或if let
打开它
更改您的代码
let filtererArr = structArrayWithNoOptionals.filter({
guard let totalFare = $0.totalFare else { return false }
return getFloatNumberFromPriceString(removeCommaFromPriceString(totalFare)) >= minPrice &&
getFloatNumberFromPriceString(removeCommaFromPriceString(totalFare)) <= maxPrice
})
答案 1 :(得分:1)
像Niko所说(+1),你应该避免强迫展开!
。通过if let
或guard let
执行可选绑定。
就个人而言,我可能不会使用removeCommaFromPriceString
和getFloatNumberFromPriceString
,而是使用NSNumberFormatter
。
例如,在Swift 3中:
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
let filtererArr = structArrayWithNoOptionals.filter {
guard let string = $0.totalFare, let totalFareValue = formatter.number(from: string)?.doubleValue else { return false }
return totalFareValue >= minPrice && totalFareValue <= maxPrice
}
数字格式化程序将自动处理带有数千个分隔符的字符串(我假设你是删除逗号的意图),但它也会处理国际数字格式(例如在德国,千位分隔符是.
和小数点是,
)。