Идентификаторы, предоставленные при сбое, не уникальны
У меня есть searchController, когда я пытаюсь удалить текст в searchController, вылетает сообщение.
предоставленные идентификаторы не уникальны
Я пытаюсь исправить это с помощью такой хэш-функции и сделать мою модель Hashable и Equatable. но все еще не решает проблему, пожалуйста, помогите. это мой код, если в моем коде что-то непонятно. не стесняйтесь упоминать меня, я обновлю его:)
struct PhotosResults: Decodable {
var total, totalPages: Int
var results: [PhotoItem]
}
// MARK: - Result
struct PhotoItem: Decodable {
var id: String
var createdAt: String
var width, height: Int
var color: String
var likes: Int
var likedByUser: Bool
var description: String?
var user: User
var urls: Urls
}
extension PhotoItem: Hashable, Equatable {
static func == (lhs: PhotoItem, rhs: PhotoItem) -> Bool {
return lhs.id == rhs.id
}
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
}
// MARK: - Urls
struct Urls: Decodable {
var raw, full, regular, small: String
var thumb: String
}
// MARK: - User
struct User: Decodable {
var id, username, name, firstName: String
var lastName, instagramUsername, twitterUsername: String?
var portfolioUrl: String?
var profileImage: ProfileImage
}
extension User: Hashable, Equatable {
static func == (lhs: User, rhs: User) -> Bool {
return lhs.id == rhs.id
}
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
}
// MARK: - ProfileImage
struct ProfileImage: Decodable {
var small, medium, large: String
}
2 ответа
Основано на документации Apple:
Не гарантируется, что значения хэша будут одинаковыми при разных исполнениях вашей программы. Не сохраняйте хеш-значения для использования во время выполнения в будущем.
Хотя вы каким-то образом согласились с хешируемостью, возможно, что два объекта имеют одинаковый идентификатор, и в этой ситуации вы получите сообщение об ошибке, поэтому, чтобы убедиться, что все объекты уникальны, вы должны добавить UUID в желаемую структуру. Например, PhotoItem должно выглядеть так:
struct PhotoItem: Decodable {
let uuid = UUID()
var id: String
var createdAt: String
var width, height: Int
var color: String
var likes: Int
var likedByUser: Bool
var description: String?
var user: User
var urls: Urls
}
extension PhotoItem: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(uuid)
}
static func ==(lhs: PhotoItem, rhs: PhotoItem) -> Bool {
return lhs.uuid == rhs.uuid
}
}
вы можете использовать это решение для других структур. Hashable соответствует Equatable по умолчанию, поэтому вам не нужно снова соответствовать ему.
Примечание. Я случайно дважды загружал свои данные. Я получил это только тогда, когда прокрутил ячейку, содержащую идентификатор, а не первый снимок коллекции. Поэтому, если у вас это происходит только иногда, убедитесь, что вы загружаете свои ячейки только при начальной загрузке.