2016-12-01 185 views
3

在Swift中,我們可以通過type(of:)Mirror(reflecting:).subjectType確定變量的類型。靜態與動態類型

DocumentationMirror.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) 

使用調試配置在Xcode iPhone上運行時,使輸出:

B 
B 
B 
B 

和(Product -> Scheme -> Edit -> Build Configuration -> Release下切換到它),使用推出配置中運行,給出:

A 
B 
B 
B 

這是Swift編譯器中的一個bug。

UPDATE我開了JIRA ticket

+0

在一些使用NSObject子類,純Swift類和結構的快速測試中,我沒有看到從類型(of:)'和Mirror(反射:)。subjectType'返回的類型之間有任何差異。如果您認爲您遇到了編譯器錯誤,我建議您在http://bugs.swift.org上打開JIRA票證。 – JAL

+0

@JAL完成。查看更新。 – mixel

回答