在函数中使用关键字guard会自动使函数的参数在swift中可选吗?

时间:2017-01-21 01:52:48

标签: ios swift uiimagepickercontroller apple-documentation

我对编程很新,我正在阅读Start Developing iOS Apps (Swift) programming guide。我理解,期权有一个问号后缀,这意味着该值可能是零或其他值。 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's UIImagePickerControllerDelegate documentation未将此参数列为可选参数,我们为本教程创建的UIImagePickerController实例也不是可选的,但教程声明如下:

  

“此代码从信息中访问原始的未经编辑的图像   字典。它安全地解开字典返回的可选项   并将其转换为UIImage对象。期望是   展开和铸造操作永远不会失败。如果他们这样做了   表示应用中需要修复设计的错误   时间“。

这是否意味着通过使用guard关键字,它会自动将变量转换为可选的?

3 个答案:

答案 0 :(得分:2)

根据Apple文档

  

如果不满足一个或多个条件,则使用保护声明将程序控制转移到范围之外。

  

保护声明中任何条件的值必须是Bool类型或桥接到Bool的类型。条件也可以是可选的绑定声明。

因此guard保证变量始终包含值,或者控件将转移到范围之外。

  

它不会使任何其他变量可选。

答案 1 :(得分:2)

总之,没有。

guard语句声明某些布尔表达式为true,或强制退出当前作用域。它通常用于打开一个可选项,如果可选项包含一个值则继续,如果它是nil则退出,但它不必这样做。您也可以使用以下代码:

guard x == 3 else {
  return
}

或任何计算结果为布尔值(true / false)的表达式。

答案 2 :(得分:2)

没有。可选值来自尝试从字典中检索值。虽然info参数是类型为[String: Any]的非可选字典,但下标引用info[UIImagePickerControllerOriginalImage]返回类型为Any?的可选值。

textContent,“访问和修改字典”:

  

因为可以请求不存在值的键,所以字典的下标返回字典值类型的可选值。如果字典包含所请求键的值,则下标返回包含该键的现有值的可选值。否则,下标返回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."