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)
使用调试配置在Xcode iPhone上运行时,使输出:
B
B
B
B
和(Product -> Scheme -> Edit -> Build Configuration -> Release
下切换到它),使用推出配置中运行,给出:
A
B
B
B
这是Swift编译器中的一个bug。
UPDATE我开了JIRA ticket。
在一些使用NSObject子类,纯Swift类和结构的快速测试中,我没有看到从类型(of:)'和Mirror(反射:)。subjectType'返回的类型之间有任何差异。如果您认为您遇到了编译器错误,我建议您在http://bugs.swift.org上打开JIRA票证。 – JAL
@JAL完成。查看更新。 – mixel