强制解包可选导致过滤器中的崩溃

Posted

技术标签:

【中文标题】强制解包可选导致过滤器中的崩溃【英文标题】:Forced unwrapping of optional causes crash in Filter 【发布时间】:2016-11-11 07:59:49 【问题描述】:

我在使用这种方法时遇到了问题;我收到“致命错误:在展开可选值时意外发现 nil”错误。

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

如何解决这个问题以防止它崩溃?

【问题讨论】:

【参考方案1】:

我总是尽量避免强制解包,在你的情况下,你可以使用guard letif let 来解包

修改你的代码

let filtererArr = structArrayWithNoOptionals.filter(
    guard let totalFare = $0.totalFare else  return false 
    return getFloatNumberFromPriceString(removeCommaFromPriceString(totalFare)) >= minPrice &&
        getFloatNumberFromPriceString(removeCommaFromPriceString(totalFare)) <= maxPrice
)

【讨论】:

【参考方案2】:

就像 Niko 所说 (+1),您应该避免 ! 强制解包。改为通过if letguard let 执行可选绑定。

就个人而言,我可能会使用NSNumberFormatter,而不是使用removeCommaFromPriceStringgetFloatNumberFromPriceString

例如,在 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

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

【讨论】:

非常感谢,先生。确实有帮助 你是一个很棒的程序员。如果允许的话,我可以多次投票给你。谢谢

以上是关于强制解包可选导致过滤器中的崩溃的主要内容,如果未能解决你的问题,请参考以下文章

方法签名中的隐式解包可选

无法解包可选。没有 UITableViewCell

Alamofire URL 请求 - 解包可选值时意外发现 nil

访问无价值的隐式解包可选?

Swift中的Optional类型 (可选类型)与强制解包 ? !

关于交易接口思考