崩溃提供的标识符不是唯一的

Posted

技术标签:

【中文标题】崩溃提供的标识符不是唯一的【英文标题】:Crash Supplied identifiers are not unique 【发布时间】:2020-05-20 13:18:57 【问题描述】:

我有一个 searchController,当我尝试删除 searchController 中的文本时,消息会崩溃。

提供的标识符不是唯一的

我尝试使用像这样的哈希函数来修复它,并使我的模型具有可哈希性和可等效性。但仍然无法解决问题,请帮助。这是我的代码,如果我的代码中有不清楚的地方。随时提及我,我会更新它:)

    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


【问题讨论】:

散列函数无济于事,因为值的散列是一致的。如果您的 id 字符串不是唯一的,那么这些字符串的哈希值将不是唯一的。要么确保 id 是唯一的,要么分配一些其他值,例如将 UUID 分配给 id 但是@Paulw11 怎么样?当我尝试将 id 存储到 UUID 时,数据来自 API,它无法解析 JSON 数据 您需要提供更多信息;您的 api 中的标识符不是唯一的吗?如果是这样,那么您不需要使用它们并使用您自己的标识符。如果它们是唯一的,那么您在未显示的代码中存在问题。 【参考方案1】:

基于 Apple 文档:

不保证哈希值在不同的执行中是相等的 你的程序。不要保存哈希值以供将来使用 执行。

尽管您已经以某种方式遵守了 hashable,但两个对象可能具有相同的 id,在这种情况下,您会收到错误消息,因此为了确保所有对象都是唯一的,您必须将 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,因此您无需再次符合它。

【讨论】:

以上是关于崩溃提供的标识符不是唯一的的主要内容,如果未能解决你的问题,请参考以下文章

DiffableDataSource引发“致命:提供的标识符不是唯一的。”将MPMediaItem包装在结构中时

Android Calendar Provider:是不是有可跨多个设备使用的事件唯一标识符?

此应用程序是不是使用广告标识符 (IDFA)?

每个唯一的重用标识符是不是都有自己唯一的重用队列?

使用 OAuth 代码流时,如何使用用户定义的唯一标识符注册新用户?

Apple Healthkit 是不是存储了开发人员可以检索的唯一标识符 (UUID)?