2016-09-19 1 views
0

J'ai un morceau de code qui fonctionne si un commutateur a été défini dans les paramètres comme suit:Gardiennage contre un bouton de commutation ayant une valeur en option zéro

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

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

     if buttonState == true { 

      sign() 

     } 

Mon problème est que si le commutateur n'a jamais été activé le le programme échoue comme le compilateur indique que, "erreur fatale: trouvé inopinément tout en déballant une valeur facultative"

Ma question est alors comment mieux se garder contre une valeur nulle lors de l'utilisation d'un bool comme le commutateur dans l'instruction ci-dessus.

J'ai essayé de laisser les instructions et les instructions de garde, mais le compilateur se plaint que celles-ci ne peuvent pas être utilisées avec un booléen.

+0

Copie possible de [Qu'est-ce que "erreur fatale: trouvé de façon inattendue nil tout en déballant une valeur facultative" signifie?] (Http://stackoverflow.com/questions/32170456/what-does-fatal-error-un- unexpectedly-found- nil-while-unwrapping-an-optional-valu) –

Répondre

0

Il y a plusieurs façons de le faire. Puisque c'est un bool, il est probablement plus simple d'utiliser nulle coalescent ??:

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

Ou, vous pouvez utiliser guard pour le faire, ce qui est probablement plus robuste:

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

Notez que dans Dans les deux cas, vous devez remplacer le dépliage forcé (!) par un déballage facultatif (?).

0

J'ai une astuce qui pourrait être utile à l'avenir, bien que ce ne soit pas aussi bon que piccianoanswer qui est certainement le bon chemin à parcourir.

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

Si vous essayez de forcer CAST pour Bool (as! Bool), cela échouerait si la valeur retournée est pas Bool, ou si elle est nil. Au lieu de cela, si vous lancez conditionnellement (as? Bool), vous recevrez un Bool?. Cela chassera la valeur à un Bool si elle existe, sinon ça va vous donner nil (sans se briser.

À partir de là, vous pouvez convertir cette Bool? à Bool en utilisant l'opérateur coalescent nul (??). Il retournera vous la valeur Bool s'il y a un, sinon il retournera la valeur par défaut que vous lui donnez. dans ce cas, false.

aussi, parce que buttonState est déjà un Bool, il n'y a aucune raison de le comparer à true dans votre if déclaration. Il suffit de l'utiliser directement:

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

Vous devez utiliser:

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

Si la valeur est pas explicitement définie, elle retourne faux.

1

Si vous essayez d'obtenir un bool des UserDefaults vous pouvez utiliser

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

cette fonction retourne un Bool afin que vous sachiez que la valeur ne peut être vrai ou faux et si elle doesn Ne trouvez pas une valeur pour la clé, elle retournera false. La fonction que vous utilisez

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

retourne un ANYOBJECT? donc ça peut être nul.

1

Peu connu, mais fortement recommandé par Apple:

defaults enregistrer les valeurs qui sont considérées jusqu'à ce que l'utilisateur modifie la valeur la première fois.

Dans applicationDidFinishLaunching - au moins avant d'accéder à la valeur la première fois - enregistrez la paire clé/valeur.

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

Maintenant, la valeur est jamais nil (je sais que l'exemple Bool est assez faible)

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

Les objets prennent beaucoup plus avantage de cette façon que les types « primitifs » qui ne sont jamais nil de toute façon .

+0

Tellement bon. Cela devrait être mieux connu. – brandonscript