gpt4 book ai didi

swift - 为什么struct在转换为字典时需要符合Hashable以及Generic数组

转载 作者:行者123 更新时间:2023-11-30 10:54:37 25 4
gpt4 key购买 nike

目标是将通用列表中的项目转换为变量 uniqueKeys 的字典。 ,但我看到了错误:

Cannot subscript a value of incorrect or ambiguous type

我知道需要一些东西来符合 Hashable协议(protocol)并最终找到了解决方案,但我不完全理解为什么这个解决方案有效。

  1. 我明白为什么 T需要是Hashable因为它'进入字典键,但为什么还要 CustomSet
  2. 如果CustomSet使用Hashable为什么我不需要在它的扩展中写任何东西?

初始代码

struct CustomSet<T : Comparable > {
private var list: [T]
init(_ list: [T]){
let uniqueKeys = list.reduce(into: [:]){ dict, item in
dict[item, default: 0] += 1
}.keys
self.list = Array(uniqueKeys)
}
}

extension CustomSet : Equatable {
static func == (lhs: CustomSet, rhs: CustomSet) -> Bool {
return lhs.list.count == rhs.list.count && lhs.list.sorted() == rhs.list.sorted()
}
}

我最终解决了这个问题:

struct CustomSet<T : Comparable > : Hashable where T : Hashable {
private var list: [T]
init(_ list: [T]){
let uniqueKeys = list.reduce(into: [:]){ dict, item in
dict[item, default: 0] += 1
}.keys
self.list = Array(uniqueKeys)
}
}

extension CustomSet : Equatable {
static func == (lhs: CustomSet, rhs: CustomSet) -> Bool {
return lhs.list.count == rhs.list.count && lhs.list.sorted() == rhs.list.sorted()
}
}

我还注意到将因子分解为扩展: extension CustomSet: Hashable where T : Hashable似乎与 struct CustomSet<T : Comparable > : Hashable where T : Hashable 不一样在添加 Hashable 协议(protocol)方面,因为我仍然看到该错误

我尝试过的

如果我将其添加到泛型类型 T我仍然看到同样的错误。

struct CustomSet<T : Comparable, Hashable >

如果我添加 HashableCustomSet我看到错误

Cannot convert value of type '[T]' to expected argument type 'UnsafeRawBufferPointer'

Inheritance from non-protocol type 'Hashable'

extension CustomSet : Equatable, Hashable {
static func == (lhs: CustomSet, rhs: CustomSet) -> Bool {
return lhs.list.count == rhs.list.count && lhs.list.sorted() == rhs.list.sorted()
}

func hash(into hasher: inout Hasher) {
var hashValue: Int {
var hasher = Hasher()
self.hash(into: &hasher)
return hasher.finalize()
}
}
}

最佳答案

无需使 CustomSet 符合 Hashable。只需向泛型类型参数添加 Hashable 限制即可解决该错误

Cannot subscript a value of incorrect or ambiguous type

,这是预期的,因为 Dictionary 的键需要符合 Hashable

顺便说一句,声明符合多个协议(protocol)的语法是 &,而不是 ,,因此不需要 where 子句。

struct CustomSet<T : Comparable & Hashable> {
private var list: [T]
init(_ list: [T]){
let uniqueKeys = list.reduce(into: [:]){ dict, item in
dict[item, default: 0] += 1
}.keys
self.list = Array(uniqueKeys)
}
}

extension CustomSet : Equatable {
static func == (lhs: CustomSet, rhs: CustomSet) -> Bool {
return lhs.list.count == rhs.list.count && lhs.list.sorted() == rhs.list.sorted()
}
}

此外,您可以简单地在初始化器中执行 self.list = Array(Set(list)) 来仅存储 list 中输入的唯一元素,无需浪费时间使用字典

关于swift - 为什么struct在转换为字典时需要符合Hashable以及Generic数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54098546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com