Supongamos por el momento que ajustamos su protocolo para agregar una rutina que usa el tipo asociado:
public protocol RequestType: class {
associatedtype Model
var path: String { get set }
func frobulateModel(aModel: Model)
}
Y Swift te permitiría crear una matriz de RequestType
la forma que quieras. Podría pasar una matriz de esos tipos de solicitud a una función:
func handleQueueOfRequests(queue: [RequestType]) {
for request in queue {
request.frobulateModel()
}
}
Llego al punto en que quiero frobular todas las cosas, pero necesito saber qué tipo de argumento pasar a la llamada. Algunas de mis RequestType
entidades podrían tomar una LegoModel
, otras podrían tomar una PlasticModel
y otras podrían tomar una PeanutButterAndPeepsModel
. Swift no está contento con la ambigüedad, por lo que no le permitirá declarar una variable de un protocolo que tenga un tipo asociado.
Al mismo tiempo, tiene mucho sentido, por ejemplo, crear una matriz de RequestType
cuando SABEMOS que todos usan el LegoModel
. Esto parece razonable, y lo es, pero necesitas alguna forma de expresarlo.
Una forma de hacerlo es crear una clase (o estructura o enumeración) que asocie un tipo real con el nombre del tipo de modelo abstracto:
class LegoRequestType: RequestType {
typealias Model = LegoModel
}
Ahora es completamente razonable declarar una matriz de LegoRequestType
porque si quisiéramos frobulate
todas, sabemos que tendríamos que pasar una LegoModel
cada vez.
Este matiz con los tipos asociados hace que cualquier protocolo que los utilice sea especial. La biblioteca estándar de Swift tiene protocolos como este más notablemente Collection
o Sequence
.
Para permitirle crear una serie de cosas que implementan el Collection
protocolo o un conjunto de cosas que implementan el protocolo de secuencia, la Biblioteca estándar emplea una técnica llamada "borrado de tipo" para crear los tipos de estructura AnyCollection<T>
o AnySequence<T>
. La técnica de borrado de tipo es bastante compleja de explicar en una respuesta de Stack Overflow, pero si busca en la web, hay muchos artículos al respecto.
Puedo recomendar un video de Alex Gallagher sobre protocolos con tipos asociados (PAT) en YouTube.