Em 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 em conformidade com vários protocolos, podemos usar o protocol
declarativo:
var object: protocol<ProtocolOne,ProtocolTwo>//etc
E se eu quiser declarar um objeto que está em conformidade com um ou mais protocolos e também é de um tipo de classe base específico? O equivalente em Objective-C seria assim:
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
Em Swift, eu esperaria que fosse assim:
var object: TYPE_NAME,ProtocolOne//etc
Isso nos dá a flexibilidade de sermos capazes de lidar com a implementação do tipo de base, bem como a interface adicionada definida no protocolo.
Existe outra maneira mais óbvia que eu possa estar perdendo?
Exemplo
Por exemplo, digamos que eu tenha uma UITableViewCell
fábrica responsável por devolver 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 retirar da fila essas células, aproveitando 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 ...
Gostaria de poder especificar que a célula é um UITableViewCell
e está em conformidade com o MyProtocol
na declaração da variável?
Justificação
Se você estiver familiarizado com o Factory Pattern, isso faria sentido no contexto de ser capaz de retornar objetos de uma classe específica que implementa 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 de 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 está e, por isso, gostaria de ter flexibilidade para interagir com o tipo de classe base e a interface de protocolo declarada
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
. Este objeto parece totalmente inútil, pois NSSomething
já sabe a que se conforma. Se ele não estiver em conformidade com um dos protocolos em, <>
você terá unrecognised selector ...
travamentos. Isso não fornece nenhuma segurança de tipo.