Optionals в стрижа может быть запутанным на первый, но это помогает иметь в виду, что они просто перечисление, как:
enum Optional<T> {
case None
case Some(T) // swift enums can have data associated to them
}
Если вы уверены, что ваша опция имеет значение, отличное от ноль, то есть , это .Some
, вы можете получить доступ к этому базовому значению с помощью восклицательного знака !
.
Короче говоря, принудительное разворачивание optional!
говорит: «Хорошо, я уверен, что это необязательно содержит значение nil. Дайте его мне».
Это то, что называется force-unwrapping. Вы сообщаете системе, чтобы получить доступ к значению, соответствующему .Some(T)
, хотя вы не проверяете, является ли ваш факс .Some
или .None
. Если вы force-unwrap с !
, а ваш дополнительный вариант окажется .None
, вы получите сообщение об ошибке unexpectedly found nil while unwrapping an Optional value
.
Как правило, вы всегда должны проверять свои варианты, прежде чем разворачивать их. В нескольких случаях вы должны принять опцию: nil и force-unwrap it. Даже IBOutlet
может оказаться nil
, если вы попытаетесь получить к нему доступ, например, в prepareForSegue
. XCode автоматически делает выходы неявно разворачивается, потому что для большей части вашего жизненного цикла контроллера вашего вида не будет nil. Но вам все равно придется позаботиться о себе из этих менее распространенных случаев, в которых они находятся nil.
Вы можете проверить, если опция имеет значение, отличное от ноля стандартного способа с
if optional != nil {
// force-unwrapping after nil check is fine
optional!.someMethod()
} else {
// 'optional' is nil
}
Более идиоматическим способом сделать это с быстрым через опциональное связывание.
// binds the constant 'value' to your optional if it is non-nil
if let value = optional {
value.someMethod()
} else {
// optional is nil
}
Третий способ проверить это с сторожевого заявлением. Семантика записей охраны немного отличается от предыдущих. Вы также можете смешать охранные показания и необязательное связывание.
guard optional != nil else {
// optional is nil.
// by the end of this branch you must exit the block that
// encloses the guard statement, such as with a return or break
return
}
// if control reaches here you're guaranteed optional is non-nil
заявление Guard является аккуратной особенностью быстрым, потому что вы можете сосредоточиться на условиях, которые вы хотите, а не то, что вы не хотите. Он также сохраняет код, который обрабатывает нарушенное требование рядом с соответствующим требованием. По сравнению с тем же делом с , если оператор, охранники улучшают читаемость, делая ваши намерения ясными.
Чтобы узнать больше, ознакомьтесь с разделом основ swift documentation.
просто верните нуль. Это соглашение Swift, чтобы назвать ваши методы строчной первой буквой –