强制展开可选项导致过滤器

时间:2016-11-11 07:59:50

标签: swift struct filter

我遇到这种方法有问题;我得到一个"致命错误:在打开一个Optional值时出乎意料地发现了nil"错误。

let filtererArr = structArrayWithNoOptionals.filter({
    return getFloatNumberFromPriceString(removeCommaFromPriceString($0.totalFare!)) >= minPrice && getFloatNumberFromPriceString(removeCommaFromPriceString($0.totalFare!)) <= maxPrice
})

如何修复此问题以防止崩溃?

2 个答案:

答案 0 :(得分:2)

我总是尽量避免强行展开,在你的情况下,你可以使用guard letif 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 letguard let执行可选绑定。

就个人而言,我可能不会使用removeCommaFromPriceStringgetFloatNumberFromPriceString,而是使用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
}

数字格式化程序将自动处理带有数千个分隔符的字符串(我假设你是删除逗号的意图),但它也会处理国际数字格式(例如在德国,千位分隔符是.和小数点是,)。