2016-11-11 4 views
0

この方法で問題があります。 「致命的なエラーが発生しました:オプション値をアンラップしている間に予期せずnilが見つかりました」というエラーが表示されます。オプションの原因を強制的にアンラッピングしてフィルタでクラッシュする

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

クラッシュするのを防ぐにはどうすればよいですか?

答えて

2

私はいつもあなたは、可能な限り、あなたのケースでは、あなたが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 
}) 
1

が言ったことは

変更に(1)をあなたのコードをアンラップするために使用することができたときにアンラップ力を避けるようにしてください!強制アンラッピングを避ける必要があります。代わりにif letまたはguard 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

関連する問題