2016-10-20 2 views
0

После преобразования в Swift 3 У меня проблемы с видимостью из Obj-C (Interface Builder не может найти класс контроллера во время выполнения). Поэтому я добавил @objc отлаживать:Swift 3: Xcode утверждает, что универсальный класс является общим

@objc(ASSitesTableViewController) 
class ASSitesTableViewController : GenericFRCTableVC<Site> 

И Xcode выплевывает обратно:

Generic подклассы классов «@objc» не может иметь явный «@objc» атрибут, потому что они непосредственно не видно Objective -C

Но класс не является общим. Он наследуется только от класса, который был специализирован.

Я знаю, что подкласс специализированного типа является длинным выстрелом, поскольку он не был поддержан в более ранних версиях Swift, но он скомпилирован без жалоб. Я не ожидал, что мой класс будет пребывания generic.

Я не нашел упоминания о дженериках в разделе наследования документов Swift или наоборот.

Должен ли базовый класс быть неэквивалентным для того, чтобы подкласс был видимым для Obj-C?

ответ

2

Должен ли базовый класс быть неэквивалентным для того, чтобы подкласс был видимым для Obj-C?

Да. Подкласс не имеет в своем определении общий подстановщик, но подкласс «является» его суперклассом. «Собака» является «квадратичной» (если «Собака» является подклассом «Четвероногий»). Итак, этот класс «есть» GenericFRCTableVC<Site>. Ну, Objective-C не имеет смысла GenericFRCTableVC<Site>, поэтому он не может иметь никакого смысла ASSITTableViewController.

После преобразования в Swift 3

Я думаю, вы обнаружите, вы бы имели такую ​​же проблему в более ранней версии Swift. Я не считаю, что это связано с конверсией в Swift 3.

+0

Спасибо, что подтвердили. Большая проблема возникла из-за Swift 3, поскольку FRC (контроллер получаемых результатов) был сделан общим в этой версии, что я безуспешно пытался распространять по цепочке. – Andreas

+0

Я знаю - у меня было много трудностей с новыми импортированными генериками. Однако имейте в виду, что импортированные генерические файлы являются ковариантными по параметризованному типу. Это может помочь во многих ситуациях. – matt

+0

Все? Звучит больше похоже на безопасность типа разлома, чем на функцию, но я не мог найти документацию по этому поведению. Я думаю, что обычные массивы вели себя так же, пока Swift 2. https://youtu.be/n9yAJfYjcl4?t=39m6s – Andreas

Смежные вопросы