swift - 什么相当于 Obj.C 的 NSMutableDictionary在斯威夫特?
问题描述
Swift中的 Obj.C 等价物是什么NSMutableDictionary<Class, Class>
?
我试过了:
var dictionary = [AnyClass: AnyClass]()
但是,这会引发错误:Type 'AnyClass' (aka 'AnyObject.Type') does not conform to protocol 'Hashable'
由于每个名称只能有一个类,我们知道给定的类引用指的是一个唯一的类;在给定的命名空间中只有一个“字符串”。那么为什么这不是可散列的呢?
我也试过:
var dictionary = NSMutableDictionary<AnyClass, AnyClass>
然而,这也失败了:Cannot specialize non-generic type 'NSMutableDictionary'
我认为 Swift 应该是类型安全的,但这里编译器鼓励我将任何内容放入此 NSMutableDictionary 中,而不对其进行类型检查以确保它是 AnyClass!
另外,不要跟我说“你一开始就不应该这样做”,因为我没有这样做,在一些需要我翻译成 Swift 的 Objective C 代码中已经是这样了。我只是想以最好的方式做到这一点——如果这意味着我必须求助于非类型安全的 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"
非常适合我的需要!(这里使用 Swift 5.1)
推荐阅读
- c++ - 这个断点不会被命中
- python - 在 django 模板中显示 python str 值
- java - 访问 JAR 中的根级文件夹和文件
- python - 将 sed 正则表达式从 Shell 转换为 Python 脚本的最佳方法
- python - 如何使用 Python 中的 Pandas 库减去特定列中的所有行值?
- javascript - 通过 PHP 加载文本时用图像替换文本
- asp.net - 如何在 Asp.NET 的代码隐藏中访问 PagesSection 属性
- javascript - window.open(newURL) 然后提交一个 post 请求
- ssl - 自签名 SSL 在工作站上不起作用
- python - 为什么在文件中写入csv时会出现错误?