В Swift, как я могу объявить переменную определенного типа, которая соответствует одному или нескольким протоколам?

В Swift я могу явно установить тип переменной, объявив ее следующим образом:

var object: TYPE_NAME

Если мы хотим сделать еще один шаг и объявить переменную, соответствующую нескольким протоколам, мы можем использоватьprotocol декларативный:

var object: protocol<ProtocolOne,ProtocolTwo>//etc

Что если я хотел бы объявить объект, который соответствует одному или нескольким протоколам, а также имеет определенный тип базового класса? Эквивалент Objective-C будет выглядеть так:

NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;

В Swift я ожидаю, что это будет выглядеть так:

var object: TYPE_NAME,ProtocolOne//etc

Это дает нам возможность работать с реализацией базового типа, а также с добавленным интерфейсом, определенным в протоколе.

Есть ли еще более очевидный способ, который я мог бы пропустить?

пример

В качестве примера, скажем, у меня естьUITableViewCell фабрика, которая отвечает за возврат ячеек, соответствующих протоколу. Мы можем легко настроить универсальную функцию, которая возвращает ячейки, соответствующие протоколу:

class CellFactory {
    class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
        //etc
    }
}

позже я хочу удалить эти ячейки, используя как тип, так и протокол

var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell

Это возвращает ошибку, потому что ячейка табличного представления не соответствует протоколу ...

Я хотел бы иметь возможность указать, что ячейка являетсяUITableViewCell и соответствуетMyProtocol в объявлении переменной?

обоснование

Если вы знакомы сФабричный образец это имело бы смысл в контексте возможности возвращать объекты определенного класса, которые реализуют определенный интерфейс.

Как и в моем примере, иногда нам нравится определять интерфейсы, которые имеют смысл при применении к конкретному объекту. Мой пример ячейки табличного представления - одно из таких оправданий.

Хотя предоставленный тип не совсем соответствует упомянутому интерфейсу, объект, который возвращает фабрика, делает, и поэтому я хотел бы гибкости во взаимодействии как с типом базового класса, так и с объявленным интерфейсом протокола

Ответы на вопрос(5)

Ваш ответ на вопрос