2016-12-01 149 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

回答