由于您的字典是这样声明的
let apiURLS:[DataHelper : [String]]
这意味着键必须是 type 的实例DataHelper
。
要获取 DataHelper 类型的实例,您可以编写
DataHelper()
DataHelper 子类的实例也是有效的:
CatHelper()
DogHelper()
所以
let apiURLS:[DataHelper:[String]] = [
CatHelper(): ["abc","def"],
DogHelper(): ["ddd"],
DogHelper(): ["fff"]
]
更新
从您的评论(和更新的问题)中,我看到您希望字典的键确实是类的类型,而不是实例。
我认为这是不可能的,因为
let apiURLS:[DataHelper.Type : [String]] = [
CatHelper.self: ["abc","def"],
DogHelper.self: ["ddd"],
DogHelper.self: ["fff"]
]
error: type 'DataHelper.Type' does not conform to protocol 'Hashable'
let apiURLS:[DataHelper.Type : [String]] = [
^
所以我们不能使用类类型作为字典的键。
好的,让我们探索另一个解决方案
这个 Wrapper 可以包含 的类型DataHelper
或子类的类型DataHelper
。
class Wrapper:Hashable, Equatable {
let value: DataHelper.Type
init(_ value:DataHelper.Type) {
self.value = value
}
var hashValue: Int { get { return "\(value)".hashValue } }
}
func ==(left:Wrapper, right:Wrapper) -> Bool {
return left.value == right.value
}
像这样
Wrapper(CatHelper.self)
由于包装器是 Hashable 并且 Equatable 可以用作Dictionary
.
所以现在
let apiURLS:[Wrapper : [String]] = [
Wrapper(CatHelper.self): ["abc","def"],
Wrapper(DogHelper.self): ["ddd"],
Wrapper(DogHelper.self): ["fff"]
]
迭代
apiURLS
.map { ($0.0.value, $0.1) }
.forEach { (classType, strings) -> () in
classType.feed("Wow")
}