Swift 用户默认为生成映像代码,但在运行时崩溃

Swift 用户默认为生成映像代码,但在运行时崩溃,swift,userdefaults,mpmediaitem,apple-music,apple-musickit,Swift,Userdefaults,Mpmediaitem,Apple Music,Apple Musickit,我阅读了大量StackOverFlow文章中的代码,这似乎是一个相当简单的过程,但当我试图实现我在自己的代码中学到的东西时,它失败了 在我的“ViewController”didSelectRowAt函数中,我初始化了用户默认值 let song = tableViewData[indexPath.section].songData[indexPath.row - 1] let songImage = song.artwork UDM.shared.defaults.setValue(song

我阅读了大量StackOverFlow文章中的代码,这似乎是一个相当简单的过程,但当我试图实现我在自己的代码中学到的东西时,它失败了

在我的“ViewController”didSelectRowAt函数中,我初始化了用户默认值

let song = tableViewData[indexPath.section].songData[indexPath.row - 1]
let songImage = song.artwork

UDM.shared.defaults.setValue(song.title, forKey: "name")
UDM.shared.songCover.setValue(songImage, forKey: "cover")
然后创建一个类来保存UserDefaults

class UDM{
static let shared = UDM()

//let defaults = UserDefaults(suiteName: com.CTMVenturesInc.MusicTesters.saved.data)
let defaults = UserDefaults()
let songCover = UserDefaults()

//other funcs
}
接下来,在我的“TealViewController”中,我创建了label&image元素

@IBOutlet var label: UILabel!
@IBOutlet var coverImage: UIImageView!
最后,在TealViewController的viewDidLoad中,我设置了这些值

if let value = UDM.shared.defaults.value(forKey: "name") as? String{
    label.text = value
}
    
if let value = UDM.shared.songCover.value(forKey: "cover") as? MPMediaItemArtwork{
    coverImage.image = value.image(at: CGSize(width: 400, height: 400))
}
这只在文本默认值下运行,效果很好,但当我尝试包含图像代码时,会出现此运行错误

Thread 1: "Attempt to insert non-property list object <MPConcreteMediaItemArtwork: 0x2830c4c80> for key cover"
用这个

[UDM.shared.songCover.set: UIImagePNGRepresentation(songImage) forKey: "cover"]
但是获取一个找不到forKey的错误。我看了这篇文章,试了一下

UDM.shared.songCover.standardUserDefaults().setObject(UIImagePNGRepresentation(songImage), forKey:"cover")}
还有更多的错误

我在这里没有整理的是什么?

问题1 可以保存到用户默认值中的唯一内容是NSString、NSData、NSArray和NSDictionary(或桥接到它们的Swift类)

MPMediaItemArtwork不是其中之一;UIImage也不是

要将某些内容保存到用户默认值中,而这些默认值不是其中之一,您必须以某种方式对其进行归档,这意味着将其转换(序列化)为NSData。使用MPMediaItemArtwork您将无法做到这一点,因此您需要想出另一种策略来保存此对象中对您来说很重要的内容

仅举一个例子(这似乎就是您的目的地),从MPMediaItemArtwork派生的UIImage可以归档到NSData,现在您可以将其放入用户默认设置中

然而,这不是保存图像的好方法;最好将其数据直接作为文件保存到磁盘

问题2
用户默认值本身并不是某种深层对象,您可以在其中写入它已经包含的对象的属性,而您拥有两个不同属性的体系结构(这两个属性都只是用户默认值的实例化)是非常奇怪的。不需要传递第二个对象,只需生成一段正确类型的数据,然后调用
UserDefaults.standard.set…
通过键进行设置。

您使用的是非常旧版本的Xcode吗?
UDM.shared.songCover.standardUserDefaults().setObject(UIImagePNGRepresentation(songImage), forKey:"cover")}