【发布时间】:2020-12-30 19:06:21
【问题描述】:
我有一个类将类型收集到一个数组中,然后确定一个对象是否属于其中一种类型:
struct Item: Hashable {}
class TypeChecker {
let typeCollection: [Any.Type] = [Item.self]
func acceptObject(_ object: Any) -> Bool {
typeCollection.contains(where: { type(of: object) == $0 })
}
}
let checker = TypeChecker()
let object1: Item = Item()
checker.acceptObject(object1) // returns true
let object2: AnyHashable = Item()
checker.acceptObject(object2) // returns false
在上面的简化片段中,显式输入 object1 可以正常工作,但是,抽象输入 object2 失败。是什么赋予了?我将如何修复 TypeChecker?
【问题讨论】:
-
在第二种情况下,您已将对象声明为 AnyHashable 类型,因此编译器将接受符合 AnyHashable 的任何类型的对象,并将其视为 AnyHashable 而不是 Item。请注意,
let object3 = Item()将返回 true -
有趣的是,如果你有一个协议类型而不是
AnyHashable,你的函数将返回正确的结果。 (参见type(of:) 文档的最后一部分)显然这不起作用,因为AnyHashable是Item结构实际上没有实现的具体类型。