16

My below code was working just fine with swift 4 but after upgrading to swift 4.2 I am getting this error, I had wasted my 3 hours searching what's the issue but failed. Please if anyone can guide me how to fix this.

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

    if postType == 2 {
        let image = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey)] as! UIImage
        mediaType.image = image
    } else {
        videoURL = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.mediaURL)] as? URL
        do {
            let asset = AVURLAsset(url: videoURL!, options: nil)
            let imgGenerator = AVAssetImageGenerator(asset: asset)
            imgGenerator.appliesPreferredTrackTransform = true
            let cgImage = try imgGenerator.copyCGImage(at: CMTime.init(value: 0, timescale: 1), actualTime: nil)
            let thumbnail = UIImage(cgImage: cgImage)
            self.mediaType.image = thumbnail
        } catch {
            print("*** Error generating thumbnail: \(error)")
        }
    }
    picker.dismiss(animated: true, completion: nil)
}
Ashley Mills
  • 50,474
  • 16
  • 129
  • 160
Muhammad Khan
  • 284
  • 1
  • 3
  • 12

6 Answers6

27

You can write like...

if let image = info[.originalImage] as? UIImage {

    print("image found")
    //do something with an image

} else {
     print("Not able to get an image")
}

EDIT:

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

    //for original image
    let originalImage = info[.originalImage]

    //for edited image
    let editedImage = info[.editedImage]

    if #available(iOS 11.0, *) {
        //gives URL of image picked by user
        let imageURL = info[.imageURL]
    }

    //gives URL of media picked by user
    let mediaURL = info[.mediaURL]
}
Mahendra
  • 8,448
  • 3
  • 33
  • 56
7
info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey)]

does not make any sense. You are specifying the whole enum type InfoKey instead of a specific value, e.g.:

info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)]

Which can be probably also written just as:

info[.originalImage] as! UIImage
Sulthan
  • 128,090
  • 22
  • 218
  • 270
  • Works now. Thank you! If you want to help people, please write the solution at first. When I tried to code the first line of "Correct answer" I got the error... ) Explanations are good at the end for curios people. – J A S K I E R Jul 20 '18 at 19:55
  • 4
    @Oleksandr May opinion is that you have to read the whole answer and understand it. Explanation is the important part of the answer, the thing that will make you learn something. Blindly copy-pasting code is dangerous. – Sulthan Jul 20 '18 at 22:08
3

You can access the properties as follows.

var editedImage = (info[UIImagePickerControllerEditedImage] as? UIImage)!
var originalImage = (info[UIImagePickerControllerOriginalImage] as? UIImage)!
isuru
  • 3,385
  • 4
  • 27
  • 62
1
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
{
    // Local variable inserted by Swift 4.2 migrator.
    let info = convertFromUIImagePickerControllerInfoKeyDictionary(info)

    if picker.sourceType == .photoLibrary || picker.sourceType == .camera
    {
        let img: UIImage = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.editedImage)] as! UIImage
        EditedImage=img
        WAProfile_UserImageView.image=EditedImage
        picker.dismiss(animated: true, completion: nil)
    }
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromUIImagePickerControllerInfoKeyDictionary(_ input: [UIImagePickerController.InfoKey: Any]) -> [String: Any] {
return Dictionary(uniqueKeysWithValues: input.map {key, value in (key.rawValue, value)})}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromUIImagePickerControllerInfoKey(_ input: UIImagePickerController.InfoKey) -> String {
return input.rawValue}
1
 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        picker.dismiss(animated: true, completion: nil)
        let image = info[UIImagePickerControllerOriginalImage] as! UIImage
        yourImgView.image = image
    }
Pranit
  • 892
  • 12
  • 20
0

Although an old thread, the migrator added this function which seemed to fix things nicely:

// Function inserted by Swift 4.2 migrator.
fileprivate func convertFromUIImagePickerControllerInfoKeyDictionary(_ input: 
    [UIImagePickerController.InfoKey: Any]) -> [String: Any] {
    return Dictionary(uniqueKeysWithValues: input.map {key, value in (key.rawValue, value)})
}
Sanzio Angeli
  • 2,872
  • 1
  • 16
  • 30