Supponiamo per il momento di modificare il tuo protocollo per aggiungere una routine che utilizza il tipo associato:
public protocol RequestType: class {
associatedtype Model
var path: String { get set }
func frobulateModel(aModel: Model)
}
E Swift ti consentiva di creare una matrice RequestTypenel modo in cui desideri. Potrei passare un array di quei tipi di richiesta in una funzione:
func handleQueueOfRequests(queue: [RequestType]) {
for request in queue {
request.frobulateModel()
}
}
Arrivo al punto che voglio frobulare tutte le cose, ma ho bisogno di sapere che tipo di argomento passare alla chiamata. Alcune delle mie RequestTypeentità potrebbero prendere a LegoModel, alcune potrebbero prendere a PlasticModele altre potrebbero prendere a PeanutButterAndPeepsModel. Swift non è soddisfatto dell'ambiguità, quindi non ti permetterà di dichiarare una variabile di un protocollo che ha un tipo associato.
Allo stesso tempo ha perfettamente senso, ad esempio, creare un array di RequestTypequando SAPPIAMO che tutti usano l'estensione LegoModel. Sembra ragionevole, e lo è, ma hai bisogno di un modo per esprimerlo.
Un modo per farlo è creare una classe (o struct o enum) che associ un tipo reale al nome del tipo di modello astratto:
class LegoRequestType: RequestType {
typealias Model = LegoModel
}
Ora è del tutto ragionevole dichiarare un array di LegoRequestTypeperché se li volessimo frobulatetutti sappiamo che dovremmo passare LegoModelogni volta a.
Questa sfumatura con i tipi associati rende speciale qualsiasi protocollo che li utilizzi. La Swift Standard Library ha protocolli come questo in particolare Collectiono Sequence.
Per consentire di creare un array di cose che implementano il Collectionprotocollo o un insieme di cose che implementano il protocollo di sequenza, la Standard Library impiega una tecnica chiamata "type-erasure" per creare i tipi di struct AnyCollection<T>o AnySequence<T>. La tecnica di cancellazione del tipo è piuttosto complessa da spiegare in una risposta di Stack Overflow, ma se cerchi sul Web ci sono molti articoli a riguardo.
Posso consigliare un video di Alex Gallagher sui protocolli con tipi associati (PAT) su YouTube.