Załóżmy na chwilę, że dostosowujemy Twój protokół, aby dodać procedurę używającą skojarzonego typu:
public protocol RequestType: class {
associatedtype Model
var path: String { get set }
func frobulateModel(aModel: Model)
}
Swift miał pozwolić ci stworzyć tablicę RequestTypetak, jak chcesz. Mógłbym przekazać tablicę tych typów żądań do funkcji:
func handleQueueOfRequests(queue: [RequestType]) {
for request in queue {
request.frobulateModel()
}
}
Dochodzę do punktu, w którym chciałbym poruszyć wszystkie rzeczy, ale muszę wiedzieć, jaki rodzaj argumentu przekazać w rozmowie. Niektóre z moich RequestTypebytów mogą przyjąć LegoModel, niektóre mogą przyjąć PlasticModel, a inne mogą przyjąć PeanutButterAndPeepsModel. Swift nie jest zadowolony z niejednoznaczności, więc nie pozwoli ci zadeklarować zmiennej protokołu, który ma powiązany typ.
Jednocześnie sensowne jest, na przykład, utworzenie tablicy, RequestTypekiedy WIEMY, że wszyscy używają rozszerzenia LegoModel. Wydaje się to rozsądne i tak jest, ale potrzebujesz sposobu, aby to wyrazić.
Jednym ze sposobów jest utworzenie klasy (lub struktury lub wyliczenia), która kojarzy typ rzeczywisty z abstrakcyjną nazwą typu modelu:
class LegoRequestType: RequestType {
typealias Model = LegoModel
}
Teraz jest całkowicie rozsądne zadeklarowanie tablicy, LegoRequestTypeponieważ gdybyśmy chcieli ich frobulatewszystkich, wiemy, że za LegoModelkażdym razem musielibyśmy podać a .
Ten niuans z typami powiązanymi sprawia, że każdy protokół, który ich używa, jest wyjątkowy. Biblioteka Swift Standard ma w szczególności takie protokoły Collectionlub Sequence.
Aby umożliwić utworzenie tablicy elementów, które implementują Collectionprotokół lub zestawu elementów, które implementują protokół sekwencji, biblioteka standardowa wykorzystuje technikę zwaną „typ-erasure” do tworzenia typów struktur AnyCollection<T>lub AnySequence<T>. Technika wymazywania typów jest dość złożona do wyjaśnienia w odpowiedzi na przepełnienie stosu, ale jeśli przeszukujesz Internet, jest wiele artykułów na jej temat.
Mogę polecić film Alexa Gallaghera na temat protokołów z powiązanymi typami (PAT) na YouTube.