Swift:不能使用索引类型为[String:NSObject]的下标值。
问题描述:
好的,我在这里使用MPMediaItems,我需要从MPMediaItemArtwork获取图像。问题是因为我使用另一个框架,这imageWithSize in Swift3不适合我。我MPMediaItem似乎是在一个不同的格式:Swift:不能使用索引类型为[String:NSObject]的下标值。
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?
在框架内,家伙:作为[String:NSObject]
所以你清楚你需要使用一个String
作为重点
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)
}
}
答
的nowPlayingInfo
字典声明。
但您正在尝试使用类名为MPMediaItemArtwork
的东西。
通过阅读MPNowPlayingInfoCenter
类的概述(其中声明了nowPlayingInfo
)可以找到有效密钥的列表。如您所见,钥匙可以从MPMediaItem
文档中找到。
所以你需要用MPMediaItemPropertyArtwork
替换MPMediaItemArtwork
。
+0
那真是愚蠢。谢谢! – skyguy
你在用什么框架?它是开源的(所以我或其他人可以偷看它?)?是'nowPlayingInfo'暴露为'[String:NSObject]'字典或其他东西? –
错误说'nowPlayingInfo'是一个由字符串键入的字典。您正试图使用不是字符串的密钥来获取信息。我对这本词典一无所知,但我注意到有一个名为'MPMediaItemPropertyArtwork'的相关符号,**是一个字符串。 –
菲利普米尔斯是正确的。在'extractMetadata'方法中,您可以清楚地看到图像存储在MPMediaItemPropertyArtwork键下,并且它的类型为'MPMediaItemArtwork'。在你的代码中你混淆了关键'MPMediaItemPropertyArtwork'和类型'MPMediaItemArtwork'。改变你的代码:'如果让artWork = AudioPlayerManager.shared.currentTrack?.nowPlayingInfo?[MPMediaItemPropertyArtwork]为? MPMediaItemArtwork {// ...}' –