No Swift, como posso declarar uma variável de um tipo específico que esteja em conformidade com um ou mais protocolos?
No Swift, posso definir explicitamente o tipo de uma variável, declarando-a da seguinte maneira:
var object: TYPE_NAME
Se quisermos dar um passo adiante e declarar uma variável que esteja em conformidade com vários protocolos, podemos usar oprotocol
declarativo:
var object: protocol<ProtocolOne,ProtocolTwo>//etc
E se eu quiser declarar um objeto que esteja em conformidade com um ou mais protocolos e também seja de um tipo de classe base específico? O equivalente ao Objective-C ficaria assim:
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
Em Swift, eu esperaria que fosse assim:
var object: TYPE_NAME,ProtocolOne//etc
Isso nos dá a flexibilidade de poder lidar com a implementação do tipo base, bem como com a interface adicionada definida no protocolo.
Existe outra maneira mais óbvia que eu possa estar perdendo?
ExemploComo exemplo, digamos que eu tenho umUITableViewCell
fábrica responsável pelo retorno de células em conformidade com um protocolo. Podemos facilmente configurar uma função genérica que retorna células em conformidade com um protocolo:
class CellFactory {
class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
//etc
}
}
mais tarde, quero desenfileirar essas células enquanto aproveita o tipo e o protocolo
var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell
Isso retorna um erro porque uma célula de exibição de tabela não está em conformidade com o protocolo ...
Eu gostaria de poder especificar que a célula é umaUITableViewCell
e está em conformidade com oMyProtocol
na declaração da variável?
Se você estiver familiarizado com oPadrão de fábrica isso faria sentido no contexto de poder retornar objetos de uma classe específica que implementam uma determinada interface.
Assim como no meu exemplo, às vezes gostamos de definir interfaces que fazem sentido quando aplicadas a um objeto específico. Meu exemplo da célula de exibição de tabela é uma dessas justificativas.
Embora o tipo fornecido não esteja exatamente em conformidade com a interface mencionada, o objeto que a fábrica retorna o faz e, portanto, eu gostaria da flexibilidade de interagir com o tipo de classe base e a interface de protocolo declarada