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 RequestTypela 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 RequestTypeentidades podrían tomar una LegoModel, otras podrían tomar una PlasticModely 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 RequestTypecuando 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 LegoRequestTypeporque si quisiéramos frobulatetodas, sabemos que tendríamos que pasar una LegoModelcada 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 Collectiono Sequence.
Para permitirle crear una serie de cosas que implementan el Collectionprotocolo 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.