Делает ли использование ключевого слова guard внутри функции автоматически сделать параметр функции необязательным в swift?

Я довольно новичок в программировании, и я читаю Руководство по программированию Start Developing iOS Apps (Swift). Я понимаю, что у опционов есть суффикс вопросительного знака, который означает, что значение может быть ноль или какое-то другое значение. Руководство Apple рассказывает нам, как использовать UIImagePickerController и это делегат. Apple использует метод делегата imagePickerControllerdidFinishPickingMediaWithInfo(_:) который имеет словарь в качестве параметра.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        guard let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage else {
            fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
        }
    }

В документации Apple по UIImagePickerControllerDelegate этот параметр не указан как необязательный, а также UIImagePickerController экземпляр, который мы создали для этого урока, необязательный, однако в уроке говорится следующее:

"Этот код обращается к исходному неотредактированному изображению из информационного словаря. Он безопасно разворачивает необязательный аргумент, возвращаемый словарем, и преобразует его как объект UIImage. Предполагается, что операции развертывания и приведения никогда не завершатся неудачно. Если они это сделают, он представляет либо ошибка в вашем приложении, которая должна быть исправлена ​​во время разработки."

Означает ли это, что, используя ключевое слово guard, оно автоматически превращает переменную в необязательную?

3 ответа

Решение

Нет. Дополнительное значение возникает в результате попытки извлечь значение из словаря. Хотя info Аргумент - это необязательный словарь типа [String: Any]нижний индекс info[UIImagePickerControllerOriginalImage] возвращает необязательное значение типа Any?,

Из языка программирования Swift (Swift 3.0.1)"Доступ к словарю и его изменение":

Поскольку можно запросить ключ, для которого не существует никакого значения, нижний индекс словаря возвращает необязательное значение типа значения словаря. Если словарь содержит значение для запрошенного ключа, нижний индекс возвращает необязательное значение, содержащее существующее значение для этого ключа. В противном случае индекс возвращается nil:

if let airportName = airports["DUB"] {
    print("The name of the airport is \(airportName).")
} else {
    print("That airport is not in the airports dictionary.")
}
// Prints "The name of the airport is Dublin Airport."

Одним словом, нет.

Оператор guard утверждает, что некоторое логическое выражение является истинным, или оно вызывает выход из текущей области. Он обычно используется с let, чтобы развернуть необязательный параметр и продолжить, если необязательный параметр содержит значение, или выход, если он равен nil, но это не обязательно делать. Вы также можете использовать такой код:

guard x == 3 else {
  return
}

Или любое выражение, которое оценивается как логическое (true/false) значение.

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

Защитный оператор используется для переноса управления программой из области действия, если не выполнено одно или несколько условий.

а также

Значение любого условия в выражении защиты должно иметь тип Bool или тип, связанный с Bool. Условие также может быть необязательным объявлением привязки.

Так guard гарантирует, что переменная всегда содержит значение, иначе элемент управления будет передан вне области видимости.

Это не делает любую другую переменную необязательной.

Другие вопросы по тегам