Swift 4.2 Не удается преобразовать значение типа «(UIImagePickerController.InfoKey).Type» в ожидаемый тип аргумента «UIImagePickerController.InfoKey»

Мой приведенный ниже код отлично работал с swift 4, но после обновления до swift 4.2 я получаю эту ошибку, я потратил 3 часа на поиски проблемы, но не смог. Пожалуйста, если кто-нибудь может указать мне, как это исправить.

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)
}

person Muhammad Khan    schedule 19.06.2018    source источник


Ответы (4)


Вы можете написать как...

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

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

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

РЕДАКТИРОВАТЬ:

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]
}
person Mahendra    schedule 19.06.2018
comment
ЭТО ДЕЙСТВИТЕЛЬНО НЕ РАБОТАЕТ - person Mr Heelis; 14.03.2019
comment
не работает: тип «UIImagePickerController.InfoKey» (также известный как «NSString») не имеет члена «originalImage» - person juanram0n; 22.01.2020
comment
Да, это работает. UIImagePickerController.InfoKey имеет .originalImage. - person Mahendra; 22.01.2020

info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey)]

не имеет никакого смысла. Вы указываете весь тип перечисления InfoKey вместо определенного значения, например:

info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)]

Что, вероятно, также можно записать так же, как:

info[.originalImage] as! UIImage
person Sulthan    schedule 19.06.2018
comment
Работает сейчас. Благодарю вас! Если вы хотите помочь людям, сначала напишите решение. Когда я попытался закодировать первую строку правильного ответа, я получил ошибку...) Объяснения в конце хороши для любопытных людей. - person J A S K I E R; 20.07.2018
comment
@Oleksandr Может мнение, что вы должны прочитать весь ответ и понять его. Объяснение — важная часть ответа, вещь, которая заставит вас чему-то научиться. Слепое копирование кода опасно. - person Sulthan; 21.07.2018

Вы можете получить доступ к свойствам следующим образом.

var editedImage = (info[UIImagePickerControllerEditedImage] as? UIImage)!
var originalImage = (info[UIImagePickerControllerOriginalImage] as? UIImage)!
person isuru    schedule 09.08.2019
comment
Зачем использовать as?, если вы все равно собираетесь принудительно развернуть его? Либо используйте as!, либо безопасно распакуйте его. - person John Montgomery; 01.01.2020

Несмотря на то, что это старая ветка, миграционная программа добавила эту функцию, которая, похоже, хорошо все исправила:

// 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)})
}
person Sanzio Angeli    schedule 24.08.2020