1

我对编程相当陌生,我正在阅读开始开发 iOS 应用程序 (Swift) 编程指南。我知道选项有一个问号后缀,这意味着该值可以是 nil 或其他值。Apple 的指南正在引导我们了解如何使用UIImagePickerController它,它是代表。imagePickerControllerdidFinishPickingMediaWithInfo(_:)Apple 使用具有字典作为参数的委托方法。

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关键字,它会自动将变量变为可选?

4

3 回答 3

2

根据 Apple 文档

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

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

因此guard保证变量始终包含一个值,否则控件将被转移到范围之外。

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

于 2017-01-21T02:58:22.860 回答
2

一句话,没有。

守卫语句断言某个布尔表达式为真,或者它强制退出当前范围。它通常与 let 一起使用来解开一个可选项,如果可选项包含一个值则继续,或者如果它是 nil 则退出,但它不必这样做。你也可以使用这样的代码:

guard x == 3 else {
  return
}

或任何计算为布尔(真/假)值的表达式。

于 2017-01-21T03:05:45.397 回答
2

否。可选值源于尝试从字典中检索值。尽管info参数是 type 的非可选字典[String: Any],但下标引用info[UIImagePickerControllerOriginalImage]返回 type 的可选值Any?

来自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."
于 2017-01-21T03:08:14.007 回答