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