2016-09-20 3 views
3

Можно ли объявить протокол, а также определить тип объекта, который может ему соответствовать?Протокол Swift для подклассов UIViewController

У меня есть набор закрытий, которые я хотел бы настроить в разных подклассах UIViewController в моем проекте. (Все они связаны).

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

Таким образом, я могу настроить различные затворы и нажать контроллер вида на контроллер навигации.

Я могу либо ...

Верните UIViewController суперкласс и надвинуть навигации в стек, но затем не быть в состоянии установить затворы правильно, как компилятор не знает, что соответствует протоколу.

или ...

Возвращает тип протокола, и я в состоянии установить затворы правильно, но тогда компилятор не знает, что это UIViewController подкласса, так что я не могу поместить его на навигационном контроллер ,

Есть ли способ сделать то и другое?

Благодаря

+0

Вы можете определить во время выполнения, соответствует ли объект к протоколу –

+0

@NazmulHasan Ах, так вы говорите, просто вернуть их как 'UIViewController ', а затем выполните« if let ... », чтобы определить, что он соответствует протоколу? – Fogmeister

ответ

1

В Objective C вы были в состоянии объявить переменную как это:

UIViewController <Protocol> *variable; 

К сожалению, это невозможно с Swift, который рассматривает как протокол-ориентированный Свифт, это очень странно ,

Это довольно неудобно, потому что, как вы узнали, компилятор не может одновременно знать как класс, так и протокол, поэтому вам нужно дважды отбрасывать, вы должны проверить, что объект имеет разрешенный класс во время выполнения, и должен документировать его в коде, чтобы люди не могли отправлять объект неправильного типа.

+0

Да, это то, что я искал. Жаль, похоже, я не в состоянии это сделать.Я могу сделать, как сказал Насмул в вопросе, но тогда вы можете либо передать UIViewController, который не соответствует протоколу или другому типу объектов, который это делает. Имейте в коде защищать его в любом случае. Спасибо за подтверждение. – Fogmeister

1

Да, вы можете! ли это так ..

// протокол, чтобы убедиться в соответствии объекта является подкласс UIViewController

общественный протокол IamViewController {}

// сделать каждый UIViewController принять протокол IamViewController

расширение UIViewController: IamViewController {}

// Creat ваш протокол и добавить требование о том, что Должно быть UIViewControl Лер, если он хочет, чтобы соответствовать ей

протокол vcObject: IamViewController { }

+0

А, ок. Мне это нравится. Протокол IAmViewController предназначен для «тегов» каждого ViewController, чтобы компилятор мог его распознать. Приятно, завтра посмотрю, когда вернусь на работу. Благодарю. – Fogmeister

+0

Да, вы правы, вот как я это сделал, в моем проекте. – Dasem

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