静态与动态类型

时间:2016-12-01 14:21:49

标签: swift reflection

在Swift中,我们可以通过type(of:)Mirror(reflecting:).subjectType确定变量的类型。

关于Mirror.subjectType

Documentation说:

  

反映主体的静态类型。

     

当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)

使用Debug配置从Xcode在iPhone上运行时输出:

B
B
B
B

并使用Release配置运行(在Product -> Scheme -> Edit -> Build Configuration -> Release下切换到它)给出:

A
B
B
B

哪个接缝是Swift编译器中的错误。

更新我打开了JIRA ticket

1 个答案:

答案 0 :(得分:1)

issue现在应该是fixed在现在和下一个(在3.0.2之后)Swift版本。

感谢Joe Groff