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ę RequestType
tak, 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 RequestType
bytó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, RequestType
kiedy 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, LegoRequestType
ponieważ gdybyśmy chcieli ich frobulate
wszystkich, wiemy, że za LegoModel
każ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 Collection
lub Sequence
.
Aby umożliwić utworzenie tablicy elementów, które implementują Collection
protokół 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.