我用来UITableviewDiffableDataSource显示UITableView音乐库中的歌曲。这段代码运行良好:
let tracks: [MPMediaItem] = MPMediaQuery.songs().items ?? []
self.dataSource.apply(section: 0, items: tracks)
但是当我包裹MPMediaItem在一个 custom中时Track struct,我得到了这个错误:Fatal: supplied identifiers are not unique.
struct Track: Equatable, Hashable {
let item: MPMediaItem
var title: String? { item.title }
init(item: MPMediaItem) {
self.item = item
}
}
let items = MPMediaQuery.songs().items ?? []
let tracks: [Track] = items.map { Track(item: $0) }
self.dataSource.apply(section: 0, items: tracks)
MPMediaItem已经符合Equatable,所以我认为如果我在另一个也符合and ( )Hashable的结构中使用它应该没问题。EquatableHashableTrack struct
更新 1:是我为方便apply(section:items:)添加的扩展:UITableViewDiffableDataSource
extension UITableViewDiffableDataSource {
func apply(section: SectionIdentifierType, items: [ItemIdentifierType], animatingDifferences: Bool = false) {
var snapshot = NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType>()
snapshot.appendSections([section])
snapshot.appendItems(items)
apply(snapshot, animatingDifferences: animatingDifferences)
}
}
更新2:在我符合协议后它起作用Track了:Identifiable
struct Track: Equatable, Hashable, Identifiable {
let item: MPMediaItem
let id: MPMediaEntityPersistentID
var title: String? { item.title }
init(item: MPMediaItem) {
self.item = item
self.id = item.persistentID
}
}
甚至更改title为 store 属性也可以正常工作:
struct Track: Equatable, Hashable {
let item: MPMediaItem
let title: String?
init(item: MPMediaItem) {
self.item = item
self.title = item.title
}
}
是什么让这些案例之间如此不同?为什么在MPMediaItem用作结构的唯一存储属性时会出现错误Track?提前致谢!