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
,