Swift: 不能用索引类型下标 [String:NSObject] 的值?

Swift: cannot subscript value of [String:NSObject] with index of type?

好的,我在这里使用 MPMediaItems,我需要从 MPMediaItemArtwork 获取图像。问题是因为我使用的是另一个框架,这个 对我不起作用。我的 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)
        }
    }

nowPlayingInfo 字典被声明为 [String:NSObject] 所以你显然需要使用 String 作为键。

但是您正在尝试使用 MPMediaItemArtwork 之类的东西,这是一个 class 名称。

可以通过阅读 MPNowPlayingInfoCenter class (which is where nowPlayingInfo is declared). As you can see, the keys can be found from the MPMediaItem 文档的概述找到有效密钥的列表。

因此您需要将 MPMediaItemArtwork 替换为 MPMediaItemPropertyArtwork