【问题标题】:swift 2 initializer for conditional binding must have Optional type, not 'UIImage'用于条件绑定的 swift 2 初始化程序必须具有 Optional 类型,而不是 'UIImage'
【发布时间】:2015-10-17 05:13:03
【问题描述】:

更新我的 xcode 以运行 swift 2 后,它给了我这两个我难以解决的错误。

错误 1 无法为“[String : AnyObject]?”类型的值下标具有“字符串”类型的索引

代码

let image : UIImage = editingInfo[UIImagePickerControllerOriginalImage] as! UIImage

错误 2 条件绑定的初始化程序必须具有 Optional 类型,而不是 'UIImage'

代码

if let constImage = image  (Error2 display here) 
        {
            let targetWidth = UIScreen.mainScreen().scale * UIScreen.mainScreen().bounds.size.width
            let resizedImage = constImage.resize(targetWidth)

            picker.dismissViewControllerAnimated(true, completion: {
                () -> Void in

                NetworkManager.sharedInstance.postImage(resizedImage, completionHandler: {
                    (error) -> () in

                    if let constError = error
                    {
                        self.showAlert(constError.localizedDescription)
                    }
                })

            })
        }

【问题讨论】:

  • Swift 2 修复了 Objective-C 代码与 Swift 之间存在的大量不良转换。所以你的“constImage”变量很可能已经保证是一个 UIImage 和/或不是一个可选类型,所以你不需要有条件地打开它。

标签: swift2


【解决方案1】:

以下代码...

let image : UIImage = editingInfo[UIImagePickerControllerOriginalImage] as! UIImage

...如果没有UIImagePickerControllerOriginalImage 键或者不是图像,将会崩溃。

你从哪里得到editingInfo?因为imagePickerController:didFinishPickingImage:editingInfo: 在 Swift 中不可用。你应该使用optional func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])

您在下一行的第二个错误...

if let constImage = image

... 是由let image: UIImage = ... 行引起的。您的image 属于UIImage 类型,而不是UIImage?。因此它不是可选的,您不能在if let constImage = image 中使用它。如果你想以这种方式使用它,必须是UIImage?。顺便说一句,不需要使用let image: UIImage = ...let image = ... 就足够了,因为编译器可以从您的语句中推断出变量类型。

把它改写成这样。

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

  guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else {
    // throw an error, return from your function, whatever
    return
  }
  // from now you can use `image` safely
  // it does exist and it's not optional

  let targetWidth = UIScreen.mainScreen().scale * UIScreen.mainScreen().bounds.size.width
  let resizedImage = image.resize(targetWidth)

  picker.dismissViewControllerAnimated(true, completion: {
    () -> Void in

    NetworkManager.sharedInstance.postImage(resizedImage, completionHandler: {
      (error) -> () in

      if let constError = error
      {
        self.showAlert(constError.localizedDescription)
      }
    })

  })

}

以下部分...

  guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else {
    // throw an error, return from your function, whatever
    return
  }

...这样做...

  • info 字典中有 UIImagePickerControllerOriginalImage 键的值吗?如果否,则执行else {} 语句,
  • 值在那里,我可以将它转换为UIImage吗?如果否,则执行else {} 语句,
  • 现在我们将 info 的值成功转换为 UIImage 并存储在 image 中,else {} 语句未执行,我们的函数继续运行。

例如,当字典值类型为AnyObject 时,如何从某种类型的字典中获取值的安全方法。

【讨论】:

    猜你喜欢
    • 2018-03-05
    • 2015-10-19
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2021-04-26
    • 2016-01-27
    相关资源
    最近更新 更多