Swift3 опциональное сцепление и развертывание с обработкой ошибок

Я пытаюсь развернуть необязательный, используя синтаксис guard let. Цель с использованием функции let let состоит в том, чтобы развернуть дополнительные параметры, прервав процедуру, если когда-либо встречается.none/nil.

Я думал, что это означало, что опциональное не может быть юридически возвращено из выражения на правой стороне охранного письма. Однако, кажется, что если вы объедините два выражения, производящих необязательные выражения, в выражение RHS, только одно из этих выражений, производящих необязательные выражения, будет оцениваться в целях обеспечения безопасности let. Например, переменная parsedResponse ниже будет хранить необязательный параметр:

guard let parsedResponse = try? (JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String:Any]) else {
                displayError(withString: "Error parsing data as JSON")
                return
            }

Попробовать? Ключевое слово создает необязательный, как и оператор условного приведения как?. Если вы измените любой из этих двух операторов, попробуйте! или как!, вы получите ожидаемый результат.

Это ожидаемое поведение? Я предполагал, что попытка сделать что-то подобное приведет к поведению, аналогичному необязательному сцеплению, и защитное средство let выполнит код "else" в тот момент, когда встретится.none/nil где-нибудь на пути выполнения оценки RHS. Тем не менее, это не так.

Что это даже означает иметь необязательную оценку в константе / переменной, введенной защитной записью?

1 ответ

Решение

Я думаю, если вы переставите паренсы, это сработает.

guard let parsedResponse = (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)) as? [String:Any] else {
Другие вопросы по тегам