【问题标题】: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
})

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

【问题讨论】:

    标签: swift struct filter


    【解决方案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
      }
      

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

      【讨论】:

      • 非常感谢,先生。确实有帮助
      • 你是一个很棒的程序员。如果允许的话,我可以多次投票给你。谢谢
      猜你喜欢
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      相关资源
      最近更新 更多