强制解包可选导致过滤器中的崩溃
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 let
或if 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 let
或guard let
执行可选绑定。
就个人而言,我可能会使用NSNumberFormatter
,而不是使用removeCommaFromPriceString
和getFloatNumberFromPriceString
。
例如,在 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
数字格式化程序会自动处理带有千位分隔符的字符串(我认为这是您删除逗号的意图),但它也会处理国际数字格式(例如,在德国,千位分隔符是 .
和小数点是,
)。
【讨论】:
非常感谢,先生。确实有帮助 你是一个很棒的程序员。如果允许的话,我可以多次投票给你。谢谢以上是关于强制解包可选导致过滤器中的崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Alamofire URL 请求 - 解包可选值时意外发现 nil