Как вырваться из охранного оператора вне функции? - PullRequest
0 голосов
/ 26 сентября 2018

Я запускаю некоторый код на игровой площадке.

var  optional:  Int?
guard let unwrapped = optional else {
    print("optional is nil")
    return
}
print("Optional is not nil”)

С этим текущим кодом я получаю сообщение об ошибке «Вернуть недопустимое значение вне функции».Если я заменяю return на break, я получаю ошибку, которая говорит, что break разрешено только внутри цикла или переключателя.Если после оператора print у меня нет других утверждений, я получаю сообщение об ошибке: «Защитное тело не должно провалиться, рассмотрите возможность использования return или throw для выхода из области».

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

На верхнем уровне вы можете использовать fatalError() для прекращения выполнения:

var  optional:  Int?
guard let unwrapped = optional else {
    fatalError("optional is nil")
}
print("Optional is not nil!")

Это позволяет программе компилироваться.При его выполнении будет отображаться ошибка

: выполнение было прервано

в «фатальной» строке и

фатальная ошибка: необязательноnil: файл MyPlayground.playground, строка 5

отображается в консоли.

0 голосов
/ 26 сентября 2018

guard используется для выхода из текущей области, если условие не выполняется.Вы можете использовать return или throw для выхода из функции или break или continue для выхода из токовой петли.Проблема в том, что у вас нет возможности выйти.

Если вы хотите использовать guard на игровой площадке на верхнем уровне без сбоев (см. ответ Мартина R дляаварийное решение), вы можете заключить ваши операторы в цикл repeat-while false для их однократного выполнения, а затем использовать break в предложении else guard:

var  optional:  Int?
repeat {
    guard let unwrapped = optional else {
        print("optional is nil")
        break
    }
    print("Optional is not nil, has value \(unwrapped)")
} while false

или в качестве альтернативыМартин Р предложил в комментариях использовать label: do { } область с break label:

var  optional:  Int?
checkNil: do {
    guard let unwrapped = optional else {
        print("optional is nil")
        break checkNil
    }
    print("Optional is not nil, has value \(unwrapped)")
}
0 голосов
/ 26 сентября 2018

Вы можете использовать exit(_: Int) для выхода из процесса.Это дает желаемый эффект.

Надеюсь, это поможет!

...