2016-12-01 3 views
3

В 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.

+0

В некоторых быстрых тестах с подклассами NSObject, чистыми классами Swift и структурами я не видел различий между типами, возвращаемыми из 'type (of:)' и 'Mirror (отражающий :). SubjectType'. Если вы считаете, что столкнулись с ошибкой компилятора, я рекомендую открыть билет JIRA на http://bugs.swift.org. – JAL

+0

@JAL Сделано. См. Обновление. – mixel

ответ

1

issue должно быть fixed в настоящее время и в следующем (после 3.0.2) скоростной версии.

Joe Groff.

Смежные вопросы