2016-09-19 4 views
0

nilのオプションの値を持つスイッチボタンに対する保護:私は次のようにスイッチを設定で設定されている場合に実行されるコードの部分を持っている

UserDefaults.standard.bool(forKey: "signatureSwitchState") 

     let buttonState = UserDefaults.standard.object(forKey: "signatureSwitchState") as! Bool 

     if buttonState == true { 

      sign() 

     } 

私の問題は、スイッチがアクティブ化されていないされている場合プログラムは、 "致命的なエラー:予期せず、オプション値をアンラッピングしている間にnilが見つかりませんでした"と述べています。

上記のステートメントでスイッチなどのブールを使用するときは、

私はlet文とguard文を試しましたが、コンパイラはboolと一緒に使うことができないと不平を言っています。

+0

[「致命的なエラー:予期せぬことに任意の値をアンラッピングしている間に何も見つかりません」という意味の重複がありますか?](http://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found-ノン・アンド・ラッピング・オプション・バリュー) –

答えて

0

これを行うにはいくつかの方法があります。これはブール値であるので、それだけではnil-合体??を使用するために、おそらく最も簡単です:

let buttonState = UserDefaults.standard.object(forKey: "signatureSwitchState") as? Bool ?? false 

それとも、あなたはおそらく、より堅牢である、それを行うにはguardを使用することができます。

guard let buttonState = UserDefaults.standard.object(forKey: "signatureSwitchState") as? Bool else { return } 
if buttonState == true { 
    sign() 
} 

注こといずれの場合も、強制アンラップ(!)をオプションのアンラップ(?)に変更する必要があります。

0

将来役に立つかもしれないヒントを持っていますが、確かに正しい方法はpiccianoanswerほど良くありません。

UserDefaults.standard.object(forKey: "signatureSwitchState")は、AnyObjectを返します。

あなたはBoolas! Bool)にキャストを強制しようとした場合、戻り値はBoolでない場合、またはそれがnilであれば、これはクラッシュします。代わりに、条件付きでキャスト(as? Bool)すると、Bool?が届きます。それが存在する場合、これはクラッシュすることなく(それ以外の場合は、あなたにnilをあげる、Boolに値をキャストします。

をそこから、あなたはnilを合体演算子(??)を使用してBoolにこのBool?を変換することができます。それは戻りますあなたBool値1が存在する場合、それ以外の場合は、あなたがそれを与えるデフォルト値を返します。この場合は、false

また、buttonStateはすでにBoolあるので、自分の中でtrueにそれを比較する理由はありませんifステートメント。直接使用してください:

let buttonState = UserDefaults.standard.object(forKey: "signatureSwitchState") as? Bool ?? false 
if buttonState { 
    sign() 
} 
1

あなたは使用する必要があります。

let buttonState = UserDefaults.standard.bool(forKey: "signatureSwitchState") 

を値が明示的に設定されていない場合、それはfalseを返します。

1

あなたはUserDefaultsからブール値を取得しようとしている場合は、

let buttonState = UserDefaults.standard.bool(forKey: "signatureSwitchState")

この機能を使用すると、値が唯一の真または偽であることを知っているので、ブールを返し、それはdoesnの場合に使用することができますキーの値を見つけるとfalseを返します。あなたは

UserDefaults.standard.object(forKey: "signatureSwitchState")

を使用している機能はANYOBJECTを返しますか?だからそれは無くてもかまいません。

1

リトル知られているが、非常にAppleが推奨:ユーザーが値を最初に変更するまで考えられている

登録のデフォルト値を。

applicationDidFinishLaunching - 少なくとも最初に値にアクセスする前に、キーと値のペアを登録してください。

let userDefaults = UserDefaults.standard 
let defaultValues : [String : Any] = ["signatureSwitchState" : false] 
userDefaults.register(defaults: defaultValues) 

今値がnilことはありません(私はBool例はかなり弱いですけど)

let buttonState = UserDefaults.standard.bool(forKey: "signatureSwitchState") 

オブジェクトはとにかくnilされることはありません「プリミティブ」タイプよりもその方法のより多くの利点を取ります。

+0

とても良いです。これはよく知られているはずです。 – brandonscript

関連する問題