Swift 继承/对象结构
Swift Inheritance / Object Structure
将下面的复杂对象层次结构定义为 XCode 中的游乐场:
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 {{{...}}}
结果表明 bar
和 baz
是由其父实例组成的对象,而不是从它们继承。
这只是 XCode 呈现这些对象的方式,还是它们的结构不符合我的预期?
我认为这就是继承(和协议采用)在水下 Swift 的工作方式。可能只是一个 C 结构,它包含指向同类“嵌入式”结构的指针。
例如如果您在正常项目中执行相同类型的代码并对其进行调试,那么您会看到每一层继承和协议采用都“包裹”在前一层周围,每一层仅提供已定义的 methods/properties靠它。
没有直接关系,但读起来仍然很有趣:
Swift is implemented in C. You can see an overview of one person's analysis here: https://github.com/rodionovd/SWRoute/wiki/Function-hooking-in-Swift
With Swift going open-source, I imagine this question will be answered more completely at that point.
您看到的只是一个默认的描述,它反映了超类就位的事实。
此默认描述已在 Xcode 7 中更改。
您可以自定义它。
如果您想了解更多细节,可以研究 reflect
和 Mirror
的工作原理。
简而言之,子类的镜像保持(并且必须)跟踪超类。因此 Baz
在它的镜像中有一个超类,它是一个 Bar
,然后 Bar
在它的镜像中有一个超类,它是 Foo
。
这就是为什么在 Xcode 6 中你会看到 {}
每个子类级别的封装。
希望对您有所帮助
将下面的复杂对象层次结构定义为 XCode 中的游乐场:
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 {{{...}}}
结果表明 bar
和 baz
是由其父实例组成的对象,而不是从它们继承。
这只是 XCode 呈现这些对象的方式,还是它们的结构不符合我的预期?
我认为这就是继承(和协议采用)在水下 Swift 的工作方式。可能只是一个 C 结构,它包含指向同类“嵌入式”结构的指针。
例如如果您在正常项目中执行相同类型的代码并对其进行调试,那么您会看到每一层继承和协议采用都“包裹”在前一层周围,每一层仅提供已定义的 methods/properties靠它。
没有直接关系,但读起来仍然很有趣:
Swift is implemented in C. You can see an overview of one person's analysis here: https://github.com/rodionovd/SWRoute/wiki/Function-hooking-in-Swift
With Swift going open-source, I imagine this question will be answered more completely at that point.
您看到的只是一个默认的描述,它反映了超类就位的事实。
此默认描述已在 Xcode 7 中更改。
您可以自定义它。
如果您想了解更多细节,可以研究 reflect
和 Mirror
的工作原理。
简而言之,子类的镜像保持(并且必须)跟踪超类。因此 Baz
在它的镜像中有一个超类,它是一个 Bar
,然后 Bar
在它的镜像中有一个超类,它是 Foo
。
这就是为什么在 Xcode 6 中你会看到 {}
每个子类级别的封装。
希望对您有所帮助