Почему Guard позволяет x = x вести себя по-разному?

Почему Guard позволяет x = x внутри метода вести себя иначе, чем снаружи?

Пример кода ниже скопирован прямо из Playground.

var x:Int? = 3

func foo(x: Int?) {
    guard let x = x else {
        return
    }

     print(x)  // print "3\n"
}

foo(x)

guard let x = x else { 
  throw NSError(domain: "app", code: 0, userInfo: nil)
}

print(x)  // print "Optional(x)\n"

person Boon    schedule 17.06.2015    source источник


Ответы (1)


Операторы guard требуют return, break, continue или throw в своем предложении else. Если вы исправите необязательный параметр в x?.description, компилятор укажет на эту ошибку. Использование защиты вне области действия функции не имеет смысла, поскольку она предназначена для проверки условия и выхода из этой области, если оно недействительно. Вы получите сообщение об ошибке:

guard корпус не может провалиться.

Единственный способ сделать это действительным на игровой площадке (или вне области действия функции) — это выдать ошибку.

Согласно документации:

Предложение else в операторе защиты является обязательным и должно либо вызывать функцию, помеченную атрибутом noreturn, либо передавать управление программой за пределы области, охватывающей оператор защиты, с помощью одного из следующих операторов:

  • возвращаться
  • ломать
  • Продолжать
  • бросать
person Ian    schedule 17.06.2015
comment
Я все еще вижу различное поведение области видимости с помощью throw. Смотрите отредактированный пост. - person Boon; 17.06.2015
comment
Люди Swift подтвердили это - видимо, это ошибка компилятора. - person Boon; 17.06.2015