В 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
в объявлении переменной?
Если вы знакомы сФабричный образец это имело бы смысл в контексте возможности возвращать объекты определенного класса, которые реализуют определенный интерфейс.
Как и в моем примере, иногда нам нравится определять интерфейсы, которые имеют смысл при применении к конкретному объекту. Мой пример ячейки табличного представления - одно из таких оправданий.
Хотя предоставленный тип не совсем соответствует упомянутому интерфейсу, объект, который возвращает фабрика, делает, и поэтому я хотел бы гибкости во взаимодействии как с типом базового класса, так и с объявленным интерфейсом протокола