当前位置: 首页 > 知识库问答 >
问题:

如何创建字典,可以容纳任何关键?或者它能容纳的所有可能类型

边永贞
2023-03-14

我想创建一个不限制键类型的字典(如NSDicpedia

所以我试过了

var dict = Dictionary<Any, Int>()

var dict = Dictionary<AnyObject, Int>()

结果

error: type 'Any' does not conform to protocol 'Hashable'
var dict = Dictionary<Any, Int>()
           ^
<REPL>:5:12: error: cannot convert the expression's type '<<error type>>' to type '$T1'
var dict = Dictionary<Any, Int>()
           ^~~~~~~~~~~~~~~~~~~~~~

好的,我会用Hasable

var dict = Dictionary<Hashable, Int>()

但是

error: type 'Hashable' does not conform to protocol 'Equatable'
var dict = Dictionary<Hashable, Int>()
           ^
Swift.Equatable:2:8: note: '==' requirement refers to 'Self' type
  func ==(lhs: Self, rhs: Self) -> Bool
       ^
Swift.Hashable:1:10: note: type 'Hashable' does not conform to inherited protocol 'Equatable.Protocol'
protocol Hashable : Equatable
         ^
<REPL>:5:12: error: cannot convert the expression's type '<<error type>>' to type '$T1'
var dict = Dictionary<Hashable, Int>()
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~

所以Hasable继承赤道,但它不符合赤道???我不明白...

不管怎样,继续努力

typealias KeyType = protocol<Hashable, Equatable> // KeyType is both Hashable and Equatable
var dict = Dictionary<KeyType, Int>() // now you happy?

没有运气

error: type 'KeyType' does not conform to protocol 'Equatable'
var dict = Dictionary<KeyType, Int>()
           ^
Swift.Equatable:2:8: note: '==' requirement refers to 'Self' type
  func ==(lhs: Self, rhs: Self) -> Bool
       ^
Swift.Hashable:1:10: note: type 'KeyType' does not conform to inherited protocol 'Equatable.Protocol'
protocol Hashable : Equatable
         ^
<REPL>:6:12: error: cannot convert the expression's type '<<error type>>' to type '$T1'
var dict = Dictionary<KeyType, Int>()
           ^~~~~~~~~~~~~~~~~~~~~~~~~~

我现在很迷茫,我怎么能让编译器对我的代码满意呢?

我想像这样使用字典

var dict = Dictionary<Any, Int>()
dict[1] = 2
dict["key"] = 3
dict[SomeEnum.SomeValue] = 4

我知道我能用字典

共有3个答案

濮阳俊明
2023-03-14

我在Apple Dev论坛上的另一篇帖子上自由地交叉发布/链接到这个问题,这个问题在这里得到了回答。

上述链接的答案适用于6.1及更高版本:

struct AnyKey: Hashable {
    private let underlying: Any
    private let hashValueFunc: () -> Int
    private let equalityFunc: (Any) -> Bool

    init<T: Hashable>(_ key: T) {
        underlying = key
        // Capture the key's hashability and equatability using closures.
        // The Key shares the hash of the underlying value.
        hashValueFunc = { key.hashValue }

        // The Key is equal to a Key of the same underlying type,
        // whose underlying value is "==" to ours.
        equalityFunc = {
            if let other = $0 as? T {
                return key == other
            }
            return false
        }
    }

    var hashValue: Int { return hashValueFunc() }
}

func ==(x: AnyKey, y: AnyKey) -> Bool {
    return x.equalityFunc(y.underlying)
}
公羊晟
2023-03-14

我相信,从Swift 1.2开始,您可以使用ObjectIdentifier结构来实现这一点。它实现了Hashable(因此也是equalable)和Comparable。可以使用它包装任何类实例。我猜实现使用包装对象的底层地址作为hashValue,以及==运算符。

仇炜
2023-03-14

您现在可以使用AnyHashable,这是一个类型擦除的可哈希值,完全是为以下情况创建的:

var dict=字典

 类似资料:
  • 我试图根据现场画廊的图片显示不同的状态。thymeleaf状态 使用GalleryPicture.status定义为枚举,如下所示: 但thymeleaf同时适用于所有3种情况。我的代码有什么问题?

  • 问题内容: 我将jquery,JSON和AJAX用于注释系统。我很好奇,可以通过JSON发送/存储的内容是否有大小限制?就像用户输入大量内容并通过JSON发送一样,是否存在某种最大限制? 也可以通过JSON发送任何类型的文本。例如,有时我允许用户使用html,这样可以吗? 问题答案: JSON与其他数据格式(如XML)相似- 如果您需要传输更多数据,则只需发送更多数据。JSON请求没有固有的大小限

  • 问题内容: 在Java中,StringBuilder是否有最大字符限制? StringBuilder变量“ url”是否具有最大容量,或者它可以容纳所有内容? 问题答案: 是的,它的最大整数容量有2147483647(技术上)的限制。 在内部将特性置于对象中,并且数组的大小受到限制。

  • 问题内容: 最多可以在Java的java.util.List中添加多少数据? ArrayList是否有默认大小? 问题答案: 这取决于实现方式。由于您使用s 为数组建立索引,因此an 不能容纳多个元素。不过,A 并不受相同方式的限制,并且可以包含任意数量的元素。

  • StringBuilder对JAVA的最大容量有字符限制吗? 字符串生成器变量“url”是否具有最大容量,或者它可以容纳所有内容?