Я использовал UITableviewDiffableDataSource
с UITableView
для отображения песен из библиотеки musi c. Этот код работал нормально:
let tracks: [MPMediaItem] = MPMediaQuery.songs().items ?? []
self.dataSource.apply(section: 0, items: tracks)
Но когда я обернул MPMediaItem
внутри пользовательского 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
и 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
для хранения свойства также работало без ошибок:
struct Track: Equatable, Hashable {
let item: MPMediaItem
let title: String?
init(item: MPMediaItem) {
self.item = item
self.title = item.title
}
}
Что отличает его в этих случаях? И почему я получаю сообщение об ошибке при использовании MPMediaItem
в качестве единственного свойства хранилища структуры Track
? Заранее спасибо!