0

在 XCode 中将以下复杂对象层次结构定义到 Playground 中:

class Foo {
    var name: String

    required init(name: String) {
        self.name = name
    }
}

class Bar: Foo {
}

class Baz: Bar {
}

创建这些类的实例会产生令人困惑的结果:

var foo = Foo(name: "Hello") // renders as {name: "Hello"}
var bar = Bar(name: "Hello") // renders as {{name: "Hello"}}
var baz = Baz(name: "Hello") // renders as {{{...}}}

结果表明barbaz是由其父实例组成的对象,而不是从它们继承。

这只是 XCode 呈现这些对象的方式,还是它们的结构不像我所期望的那样?

4

2 回答 2

0

我认为这就是水下 Swift 中继承(和协议采用)的工作方式。可能只是一个 C 结构,它包含一个指向同类“嵌入式”结构的指针。

例如,如果您在普通项目中执行相同类型的代码并对其进行调试,那么您将看到每个级别的继承和协议采用都“包装”在前一个级别,每个级别仅提供由定义的那些方法/属性它。

没有直接关系,但读起来仍然很有趣:https ://stackoverflow.com/a/31325662/1542569

Swift 是用 C 实现的。你可以在这里看到一个人的分析概述:https ://github.com/rodionovd/SWRoute/wiki/Function-hooking-in-Swift

随着 Swift 的开源,我想到那时这个问题会得到更完整的回答。

于 2015-07-13T05:57:26.210 回答
0

你看到的只是一个默认的描述,它反映了超类已经到位的事实。

这个默认描述在 Xcode 7 中已经改变了。

您可以自定义它。如果您想了解更多细节,则可以调查其工作方式reflectMirror工作方式。

简而言之,您的子类的镜像保持(并且必须)跟踪超类。因此Baz,它的镜像中有一个超类,它是 a Bar,然后Bar它的镜像中有一个超类,它是Foo。这就是为什么在 Xcode 6 中您会看到{}每个子类级别的封装。

希望这可以帮助

于 2015-07-13T06:15:44.440 回答