Swift函数和闭包是否符合可哈希协议?

6
假设我想要一个函数或闭包的 Set,下面是实现方法:
typealias HandlerX = () -> ()
static var handlersX = Set<HandlerX>()

这会产生以下编译器错误:

类型 'HandlerX' (即 '() -> ()') 不符合协议 'Hashable'

这是一个死胡同吗?

一个函数数组能否解决你的问题?如果可以,你可以像这样创建一个函数数组 => var funcArray = Array< () -> Any> = [func1, func2] - Ulysses
2个回答

10

是的,这是个死胡同。Hashable并不是你的问题;因为没有办法决定两个闭包是否相等(这是Hashable的一个基本要求)。


1
你可以为闭包创建一个包装结构体。
struct Hashed<T>: Hashable {

  let value: T
  let hash: Int

  init(value: T, hash: Int) {
    self.value = value
    self.hash = hash
  }

  public func hash(into hasher: inout Hasher) {
    hasher.combine(hash)
  }

  static func == (lhs: Hashed<T>, rhs: Hashed<T>) -> Bool {
      lhs.hashValue == rhs.hashValue
  }
}

但是您需要了解闭包的身份。例如,它可以是创建它的类,或者是#filename + #line,或者总是使用UUID()唯一标识。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接