2017-01-21 8 views
0

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

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's UIImagePickerControllerDelegate documentation не перечисляет этот параметр, как опция и не является UIImagePickerController экземпляра мы создали для этого урок опциональным однако Tutorial говорится следующее:

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

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

ответ

2

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

От The Swift Programming Language (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." 
2

В соответствии с Apple, Документация

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

и

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

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

Это не делает никаких других переменных необязательными.

2

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

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

guard x == 3 else { 
    return 
} 

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