Ответ 1
Вы не можете наследовать что-то, если вы не знаете, что это такое, по нескольким причинам.
-
Во-первых, компилятор должен знать, как выложить экземпляр вашего класса в памяти. Для этого ему необходимо знать, какие переменные экземпляра (хранимые свойства) у него есть: как те, которые задает класс, так и те, которые унаследованы от суперкласса.
-
Компилятор также должен знать о свойствах и инициализаторах суперкласса, чтобы убедиться, что экземпляр вашего класса правильно инициализирован. Если свойства суперкласса неизвестны, не существует способа узнать, было ли вы инициализировано все состояние, которое вам нужно (и никому не нужно) до окончания инициализатора. Если инициализаторы суперкласса неизвестны, компилятор не может обеспечить, чтобы вы назвали инициализатор назначенного суперкласса из вашего собственного.
-
Как вы напишете реализации методов, которые ссылаются на свойства и методы суперкласса, если вы не знаете, что такое суперкласс? Если вы пишете код, который ссылается на
self.view
, то каким-то образом создайте экземпляр версии вашего класса, которая не наследуется от класса с этим свойством, этот код сломается.
Есть, вероятно, еще несколько причин, но их должно быть достаточно.:)
Хотя есть несколько мест, где вы ожидаете подкласса, Cocoa (будь то в Swift или ObjC) в целом поддерживает composition вместо наследования для настройки.
Если вы добавляете кучу функциональности в различные контроллеры представлений и повторно используете код для этого, факторизуя его в свой класс, простое решение состоит в том, чтобы сделать ваши классы контроллера классов собственными экземплярами этого класса пытаясь быть тем классом. Если у вас есть места, где вы хотите, чтобы определенные классы контроллера классов должны были иметь Foo
, вы можете определить протокол, который выражает это требование.
Если вы пытаетесь добавить функциональность к существующему классу, вы можете использовать расширение. Возможно, вы не сможете использовать расширение для добавления хранимых свойств, но вы можете его подделать. Например, вы можете использовать вычисленные свойства и определять собственное хранилище в рамках их реализации. Один из способов сделать это может заключаться в использовании функции связанных объектов в среде выполнения ObjC (которая AFAIK по-прежнему доступна из Swift).