如何在 Swift 中为 Image 实现 Hashable 结构
Posted
技术标签:
【中文标题】如何在 Swift 中为 Image 实现 Hashable 结构【英文标题】:How to implement Hashable struct for Image in Swift 【发布时间】:2020-03-04 10:00:09 【问题描述】:我正在使用 swiftui 处理聊天视图。我确实有如下的可散列结构
struct ChatMessage : Hashable
var message: String
var isMe: Bool
var avatar: String
它工作正常。但是,如果我将头像数据类型更改为图像,那么我会收到错误消息,因为 "Type 'ChatMessage' does not conform to protocol 'Hashable'"
struct ChatMessage : Hashable
var message: String
var isMe: Bool
var avatar: Image
如何将对象(图像)包含在确认 Hashable 的结构中。
【问题讨论】:
我建议添加一个唯一的id
并(仅)使用它作为哈希值。
我认为您必须创建自己的类型,例如HashableImage
使用 Swift 的 Hashable
协议。这里是苹果官方文档:developer.apple.com/documentation/swift/hashable
【参考方案1】:
SwiftUI Image
是不符合 Hashable
协议的不透明结构,并且不提供用于自定义哈希的任何属性,因此您可以在模型哈希中忽略它(不理想)或在模型中使用关于图像的一些信息参与哈希的方式(更可取)。
案例 a) - 忽略
struct ChatMessage : Hashable
func hash(into hasher: inout Hasher)
hasher.combine(message)
hasher.combine(isMe)
var message: String
var isMe: Bool
var avatar: Image
案例 b) - 包括
struct ChatMessage : Hashable
var message: String
var isMe: Bool
var avatarName: String // avatar's name included in hash automatically
var avatar: Image // calculable property not used by hashing
Image(avatarName)
【讨论】:
【参考方案2】:你可以使用这个例如:
struct ChatMessage : Hashable
func hash(into hasher: inout Hasher)
hasher.combine(UUID())
var message: String
var isMe: Bool
var avatar: Image
【讨论】:
以上是关于如何在 Swift 中为 Image 实现 Hashable 结构的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中为 Radio Live Streaming 服务实现 HLS
如何在 Swift 中为 Int 数组(自定义字符串结构)实现 Hashable 协议
如何在 Swift 中为 Int 数组(自定义字符串结构)实现 Hashable 协议