Estou brincando com a resposta desta questão: Como testar se uma variável genérica é do tipo AnyObject
Essa solução parece não funcionar mais. Tenho este código:
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())
Esse é um comportamento surpreendente.
1.
let t1 = type(of: object)
type(of:)
deveria retornar o tipo dinâmico, que é P
, não Plugin
. Mas obtive "Plugin" impresso.
2.
let b1 = t1 is AnyClass
Não deveria ser verdade, já que t1 é um tipo de referência? (com base na resposta aqui: Como testar se uma variável genérica é do tipo AnyObject )
3.
let t2 = T.self
Isso imprime Plugin
, o que faz sentido, porque eu Plugin
coloquei<>
4.
let b2 = t2 is AnyClass
Isso é falso, mas acho que deveria ser verdade pelo mesmo motivo
5.
let t3 = Mirror(reflecting: object).subjectType // P
Isso imprime P
, o que faz sentido
6.
let b3 = t3 is AnyClass // true
Isso é verdade, o que faz sentido. Mas por que é diferente dos outros dois casos?