崩溃提供的标识符不是唯一的
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:是不是有可跨多个设备使用的事件唯一标识符?