Swift: не может индексировать значение [String:NSObject] с индексом типа?

Хорошо, я работаю с MPMediaItems здесь, и мне нужно получить изображение из MPMediaItemArtwork. Проблема в том, что я использую другой фреймворк, этот imageWithSize в Swift3 не работает для меня. Кажется, мой MPMediaItem находится в другом формате:

 if let artWork = AudioPlayerManager.shared.currentTrack?.nowPlayingInfo?[MPMediaItemArtwork] as? MPMediaItemArtwork {
            trackImg = artWork.image(at: CGSize(width: 300, height: 300))!
            print("IMG: ",trackImg)
        }

Ничего не печатается, и я получаю ошибку:

cannot subscript value of [String:NSObject] with index of type MPMediaItemArtwork.Type

Что это значит? Как я могу получить изображение в UIImage отсюда?

В рамках, парень имеет:

fileprivate func extractMetadata() {
        Log("Extracting meta data of player item with url: \(url)")
        for metadataItem in (self.playerItem?.asset.commonMetadata ?? []) {
            if let _key = metadataItem.commonKey {
                switch _key {
                case AVMetadataCommonKeyTitle       : self.nowPlayingInfo?[MPMediaItemPropertyTitle] = metadataItem.stringValue as NSObject?
                case AVMetadataCommonKeyAlbumName   : self.nowPlayingInfo?[MPMediaItemPropertyAlbumTitle] = metadataItem.stringValue as NSObject?
                case AVMetadataCommonKeyArtist      : self.nowPlayingInfo?[MPMediaItemPropertyArtist] = metadataItem.stringValue as NSObject?
                case AVMetadataCommonKeyArtwork     :
                    if
                        let _data = metadataItem.dataValue,
                        let _image = UIImage(data: _data) {
                            self.nowPlayingInfo?[MPMediaItemPropertyArtwork] = self.mediaItemArtwork(from: _image)
                    }
                default                             : continue
                }
            }
        }
        // Inform the player about the updated meta data
        AudioPlayerManager.shared.didUpdateMetadata()
    }

    fileprivate func mediaItemArtwork(from image: UIImage) -> MPMediaItemArtwork {
        if #available(iOS 10.0, *) {
            return MPMediaItemArtwork.init(boundsSize: image.size, requestHandler: { (size: CGSize) -> UIImage in
                return image
            })
        } else {
            return MPMediaItemArtwork(image: image)
        }
    }

1 ответ

Решение

nowPlayingInfo словарь объявлен как [String:NSObject] так что вам явно нужно использовать String в качестве ключа.

Но вы пытаетесь использовать такие вещи, как MPMediaItemArtwork который является именем класса.

Список допустимых ключей можно найти, прочитав Обзор для MPNowPlayingInfoCenter класс (где nowPlayingInfo объявлен). Как видите, ключи можно найти в MPMediaItemдокументация.

Так что вам нужно заменить MPMediaItemArtwork с MPMediaItemPropertyArtwork,

Другие вопросы по тегам