0

以下の複雑なオブジェクト階層を 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 {{{...}}}

その結果、barbazは、親から継承するのではなく、親のインスタンスで構成されるオブジェクトであることがわかります。

これは、XCode がこれらのオブジェクトをレンダリングする方法にすぎないのでしょうか?それとも、それらの構造が私が期待するものではないのでしょうか?

4

2 に答える 2

0

これが、水中での Swift での継承 (およびプロトコルの採用) の仕組みだと思います。おそらく、同じ種類の「埋め込まれた」構造へのポインタを保持するC構造です。

たとえば、通常のプロジェクトで同じ種類のコードを実行してデバッグすると、継承とプロトコルの採用の各レベルが前のレベルに「ラップ」され、各レベルで定義されたメソッド/プロパティのみが提供されることがわかります。それ。

直接関係はありませんが、それでも読むのは興味深いです: https://stackoverflow.com/a/31325662/1542569

Swift は C で実装されています。ここで 1 人の分析の概要を見ることができます: https://github.com/rodionovd/SWRoute/wiki/Function-hooking-in-Swift

Swift がオープンソースになると、その時点でこの質問はより完全に解決されると思います。

于 2015-07-13T05:57:26.210 に答える