2016-09-19 1 views
0

У меня есть кусок кода, который выполняется, если переключатель установлен в настройках следующим образом:Guarding против кнопки выключателя, имеющего нулевую необязательное значение

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

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

     if buttonState == true { 

      sign() 

     } 

Моя проблема не, если переключатель не был активирован программа терпит неудачу, поскольку компилятор заявляет, что «фатальная ошибка: неожиданно обнаружена нуль при развертывании необязательного значения»

Мой вопрос в том, как лучше всего защитить от значения nil при использовании bool, такого как переключатель в приведенном выше описании.

Я пробовал, если допускают утверждения и операнды, но компилятор жалуется, что они не могут использоваться с bool.

+0

Возможный дубликат [Что делает «фатальная ошибка: неожиданно найденная нуль при разворачивании необязательного значения» означает?] (Http://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found- nil-while-unwrapping-an-optional-valu) –

ответ

0

Есть несколько способов, которыми вы можете это сделать. Так как это BOOL, это, вероятно, легче всего просто использовать ноль-сливающихся ??:

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.

Если вы пытаетесь заставить актеров к Bool (as! Bool), это приведет к краху, если возвращаемое значение не является Bool, или если это nil. Вместо этого, если вы условно отбрасываете (as? Bool), вы получите Bool?. Это позволит привести значение к Bool, если он существует, в противном случае она будет давать вам nil (без сбоев.

Оттуда вы можете конвертировать эту Bool? в Bool с помощью всухую оператор коалесцирующего (??). Он вернется вы значение Bool, если есть один, в противном случае он будет возвращать значение по умолчанию вы даете его. в этом случае 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") 

Если значение не установлено явно, то он вернет ложь.

1

Если вы пытаетесь получить логическое значение из UserDefaults вы можете использовать

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

эта функция возвращает Bool, так что вы знаете, что значение может быть только истинным или ложным, и если он Безразлично 't найти значение для ключа, тогда оно вернет 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