Идентификаторы, предоставленные при сбое, не уникальны

У меня есть 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 по умолчанию, поэтому вам не нужно снова соответствовать ему.

Примечание. Я случайно дважды загружал свои данные. Я получил это только тогда, когда прокрутил ячейку, содержащую идентификатор, а не первый снимок коллекции. Поэтому, если у вас это происходит только иногда, убедитесь, что вы загружаете свои ячейки только при начальной загрузке.

Другие вопросы по тегам