Swift 什么';s相当于Obj.C';s NSMutableDictionary<;阶级,阶级>;斯威夫特?

Swift 什么';s相当于Obj.C';s NSMutableDictionary<;阶级,阶级>;斯威夫特?,swift,Swift,在Swift中,Obj.C的NSMutableDictionary的等价物是什么 我试过: var dictionary = [AnyClass: AnyClass]() 但是,这会引发错误:Type'AnyClass'(也称为'AnyObject.Type')不符合协议'Hashable' 由于每个名称只能有一个类,我们知道给定的类引用引用引用一个唯一的类;给定命名空间中只有一个“字符串”。那么为什么这是不可散列的呢 我还尝试: var dictionary = NSMutableDicti

在Swift中,Obj.C的
NSMutableDictionary
的等价物是什么

我试过:

var dictionary = [AnyClass: AnyClass]()
但是,这会引发错误:
Type'AnyClass'(也称为'AnyObject.Type')不符合协议'Hashable'

由于每个名称只能有一个类,我们知道给定的类引用引用引用一个唯一的类;给定命名空间中只有一个“字符串”。那么为什么这是不可散列的呢

我还尝试:

var dictionary = NSMutableDictionary<AnyClass, AnyClass>
var dictionary=NSMutableDictionary
但是,这也会失败:
无法专门化非泛型类型“NSMutableDictionary”

我原以为Swift应该是类型安全的,但这里编译器鼓励我只将任何内容放入这个NSMutableDictionary,而不必进行类型检查以确保它是AnyClass

另外,不要对我说“你一开始就不应该这么做”,因为我没有这么做,在一些客观的C代码中已经是这样了,我需要翻译成Swift。如果这意味着我必须求助于非类型安全的NSMutableDictionary,那么就这样吧,尽管这看起来很可笑


我肯定错过了什么。。。我遗漏了什么?

我发现,在Swift中,最接近的方法是:

var classToClassMapping = Dictionary<ObjectIdentifier, AnyClass>()

extension Dictionary where Key == ObjectIdentifier, Value == AnyClass {
    subscript<T>(keyType: T.Type) -> AnyClass? {
        get {
            let id = ObjectIdentifier(keyType)
            return self[id]
        }
        set {
            let id = ObjectIdentifier(keyType)
            self[id] = newValue
        }
    }
}

classToClassMapping[Yay.self] = NSString.self

if let stringClass = classToClassMapping[Yay.self] as? NSString.Type {

    print(stringClass.init(string: "hell yeah"))

}

// Prints "hell yeah"


// Alternative:

switch classToClassMapping[Yay.self] {
case let val as NSString.Type:
    print(val.init(string: "yaiirrr boy"))
default:
    print("woops")
}

// prints "yaiirrr boy"

var classToClassMapping=Dictionary()
扩展字典,其中Key==ObjectIdentifier,Value==AnyClass{
下标(keyType:T.Type)->AnyClass{
得到{
let id=ObjectIdentifier(键类型)
返回自我[id]
}
设置{
let id=ObjectIdentifier(键类型)
self[id]=newValue
}
}
}
classToClassMapping[Yay.self]=NSString.self
如果让stringClass=classToClassMapping[Yay.self]作为?NSString.Type{
打印(stringClass.init(字符串:“该死的”))
}
//打印“该死的,是的”
//备选方案:
切换classToClassMapping[Yay.self]{
case let val作为NSString。类型:
打印(val.init(字符串:“yaiirr boy”))
违约:
打印(“woops”)
}
//打印“Yaiirr男孩”

非常适合我的需要!(此处使用Swift 5.1)

如果您编辑您的问题并显示您试图添加到词典中的对象类型,将更容易帮助您解决问题。您可能正在寻找is
var dictionary:[AnyHashable:AnyObject]=[:]
,但我仍然认为,除了为字典键使用AnyHashable类型之外,可能还有一种更好的方法。“我们知道给定的类引用引用了一个唯一的类……那么为什么它不可哈希呢?”仅仅因为任何一个给定的类与另一个不同(如果你是这么说的话),并不意味着任何一个类都是可散列的。可散列意味着该类型的每个实例都会产生一个数字散列值,而仅凭
AnyClass
,就不能提供这样的保证。@Rob嗯,就我个人而言,我不喜欢Swift中的元类型是这些奇怪的特殊事物,它们不能像Objective C中那样以正常的方式处理。尽管情况越来越好,但内省和关键路径等能够通过自身引用类型的事物非常好。不管怎样,我找到了一个非常有效的解决方案,请参见下面的答案。