我正在思考这个问题的答案:如何测试泛型变量是否属于 AnyObject 类型
该解决方案似乎不再起作用。我有以下代码:
public struct ObjectHashable<T>: Hashable {
public let object: T
public init(object: T) {
let t1 = type(of: object)
let b1 = t1 is AnyClass
print(t1) // Plugin
print(b1) // false
let t2 = T.self
let b2 = t2 is AnyClass
print(t2) // Plugin
print(b2) // false
let t3 = Mirror(reflecting: object).subjectType
let b3 = t3 is AnyClass
print(t3) // P
print(b3) // true
self.object = object
}
public static func ==(lhs: Self, rhs: Self) -> Bool {
return true
}
public func hash(into hasher: inout Hasher) {
}
}
protocol Plugin: AnyObject {}
class P: Plugin {}
typealias PluginHashable = ObjectHashable<Plugin>
PluginHashable(object: P())
这是一个令人惊讶的行为。
1.
let t1 = type(of: object)
type(of:)
应该返回动态类型,即P
,而不是Plugin
。但我打印出了“插件”。
2.
let b1 = t1 is AnyClass
因为 t1 是引用类型,所以它不应该是真的吗?(基于此处的答案:如何测试泛型变量是否属于 AnyObject 类型)
3.
let t2 = T.self
打印出来Plugin
,这是有道理的,因为我输入Plugin
了<>
4.
let b2 = t2 is AnyClass
这是错误的,但我认为出于同样的原因,它应该是正确的
5.
let t3 = Mirror(reflecting: object).subjectType // P
打印出来P
,这是有道理的
6.
let b3 = t3 is AnyClass // true
确实如此,这很有道理。但为什么它与其他两种情况不同呢?