2016-12-01 6 views
3

スイフトでは、変数のタイプをtype(of:)Mirror(reflecting:).subjectTypeで指定できます。スタティックvsダイナミックタイプ

Documentationは約Mirror.subjectType言う:

被写体の静的な型が反映されます。

このタイプは、自己がスーパークラスである場合、その被写体のダイナミックタイプと異なる場合があります。別のミラーのミラー。

私はtype(of:)のためのドキュメントを見つけることができませんでしたがproposalはそれが.dynamicType財産の交換だと言います。

私たちは動的型と静的型を持っています。どのような状況でどのような違いが現れますか?

P.S. 私は奇妙な問題を抱えているので私は尋ねています。このコード:デバッグ構成を使用してXcodeのからiPhone上で実行すると、出力できます

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) 

B 
B 
B 
B 

とリリース構成を使用して実行している(Product -> Scheme -> Edit -> Build Configuration -> Releaseの下で、それへの切り替え)が得られます。

A 
B 
B 
B 

これはSwiftコンパイラのバグである。

更新日私はJIRA ticketを開いた。

+0

NSObjectサブクラス、純粋なSwiftクラス、および構造体を使ったいくつかのクイックテストでは、 'type(of:) 'と' Mirror(reflect :)。subjectType'から返される型の間に違いは見られませんでした。コンパイラのバグが発生したと思われる場合は、http://bugs.swift.orgでJIRAチケットを開くことをお勧めします。 – JAL

+0

@ JAL完了。更新を参照してください。 – mixel

答えて

1

issueは、すぐにマスターで次は(3.0.2以降)スウィフトバージョンfixedにする必要があります。

Joe Groffに感謝します。

関連する問題