2016-11-11 64 views
0

我遇到了這種方法的麻煩;我得到一個「致命錯誤:意外地發現零,而解包可選值」錯誤。可選的強制解包導致崩潰過濾器

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

如何解決這個問題以防止它崩潰?

回答

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),你應該避免!被迫解開。改爲使用if letguard let代替進行可選綁定。

個人而言,而不是使用removeCommaFromPriceStringgetFloatNumberFromPriceString,我可能會使用NSNumberFormatter

例如,在斯威夫特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 
} 

數量格式會自動處理與千位分隔符字符串(我以爲是你刪除逗號的意圖),但它也將處理國際數字格式(例如在德國,千位分隔符是.,小數點是,)。

+0

非常感謝,SIR。確實有幫助 – Lion

+0

你是一個很棒的程序員。如果允許,我可以多次投票。謝謝 – Lion