Быстрое Наследование / Структура Объекта

Определите следующую сложную иерархию объектов ниже в игровую площадку в 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 отображает эти объекты, или их структура не такая, как я ожидал?

2 ответа

Решение

То, что вы видите, является просто описанием по умолчанию, и оно отражает тот факт, что суперклассы существуют.

Это описание по умолчанию уже изменилось в Xcode 7.

Вы можете настроить его. Если вам нравится более подробно, вы можете исследовать, как reflect а также Mirror работает.

Короче говоря, зеркало ваших подклассов отслеживает (и должно) отслеживать суперкласс. таким образом Baz имеет суперкласс в своем зеркале, которое является Bar а потом Bar имеет суперкласс в своем зеркале, которое Foo, Вот почему в Xcode 6 вы видите {} инкапсуляция для каждого уровня подклассов.

Надеюсь это поможет

Я думаю, что это способ наследования (и принятия протокола) работает в Swift под водой. Вероятно, просто структура C, которая содержит указатель на "встроенную" структуру того же вида.

Например, если вы делаете такой же код в обычном проекте и отлаживаете его, то вы увидите, что каждый уровень наследования и принятия протокола "оборачивается" вокруг предыдущего, причем каждый уровень предоставляет только те методы / свойства, которые определены Это.

Не имеет прямого отношения, но все же интересно читать: /questions/34637299/na-kakom-yazyike-napisan-swift/34637311#34637311

Swift реализован на языке C. Обзор анализа одного человека можно посмотреть здесь: https://github.com/rodionovd/SWRoute/wiki/Function-hooking-in-Swift

С учетом того, что Swift станет открытым исходным кодом, я полагаю, что на этот вопрос будет дан более полный ответ.

Другие вопросы по тегам