我用来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
的结构中使用它应该没问题。Equatable
Hashable
Track 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
?提前致谢!