В Swift мы можем определить тип переменной на type(of:)
и Mirror(reflecting:).subjectType
.Статический и динамический тип
Documentation о Mirror.subjectType
говорит:
Статический тип субъекта отражается.
Этот тип может отличаться от динамического типа объекта, когда self является супермерным зеркалом другого зеркала.
я не нашел документацию для type(of:)
но proposal говорит, что это замена для .dynamicType
собственности.
Итак, у нас есть динамические и статические типы. Какая разница между ними и в каких обстоятельствах она проявляется?
P.S. Я спрашиваю, потому что у меня странная проблема. Этот код:
protocol A: class {
}
class B: A {
}
let b = B()
class C<T> {
func test(value: T) {
print("\(type(of: value))")
print("\(Mirror(reflecting: value).subjectType)")
}
}
func test(a: A) {
print("\(type(of: a))")
print("\(Mirror(reflecting: a).subjectType)")
}
C<A>().test(value: b)
test(a: b)
при работе на iPhone с Xcode с использованием конфигурации отладки дает выход:
B
B
B
B
и работает с использованием конфигурации Release (переключатель к нему под Product -> Scheme -> Edit -> Build Configuration -> Release
) дает:
A
B
B
B
который является ошибкой в компиляторе Swift.
ОБНОВЛЕНИЕ Я открыл JIRA ticket.
В некоторых быстрых тестах с подклассами NSObject, чистыми классами Swift и структурами я не видел различий между типами, возвращаемыми из 'type (of:)' и 'Mirror (отражающий :). SubjectType'. Если вы считаете, что столкнулись с ошибкой компилятора, я рекомендую открыть билет JIRA на http://bugs.swift.org. – JAL
@JAL Сделано. См. Обновление. – mixel