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 RequestType
nel 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 RequestType
entità potrebbero prendere a LegoModel
, alcune potrebbero prendere a PlasticModel
e 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 RequestType
quando 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 LegoRequestType
perché se li volessimo frobulate
tutti sappiamo che dovremmo passare LegoModel
ogni 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 Collection
o Sequence
.
Per consentire di creare un array di cose che implementano il Collection
protocollo 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.