Предположим, на данный момент мы настраиваем ваш протокол, чтобы добавить процедуру, которая использует связанный тип:
public protocol RequestType: class {
associatedtype Model
var path: String { get set }
func frobulateModel(aModel: Model)
}
И Swift позволил вам создать массив RequestTypeтак, как вы хотите. Я мог бы передать массив этих типов запросов в функцию:
func handleQueueOfRequests(queue: [RequestType]) {
for request in queue {
request.frobulateModel()
}
}
Я дохожу до того, что хочу заморозить все, но мне нужно знать, какой тип аргумента передать в вызов. Некоторые из моих RequestTypeсущностей могли взять LegoModel, некоторые могли взять PlasticModel, а другие могли взять PeanutButterAndPeepsModel. Swift недоволен двусмысленностью, поэтому он не позволит вам объявить переменную протокола, имеющего связанный тип.
В то же время имеет смысл, например, создать массив, RequestTypeкогда мы ЗНАЕМ, что все они используют класс LegoModel. Это кажется разумным, и это так, но вам нужен способ выразить это.
Один из способов сделать это - создать класс (или структуру, или перечисление), который связывает реальный тип с именем абстрактного типа модели:
class LegoRequestType: RequestType {
typealias Model = LegoModel
}
Теперь вполне разумно объявить массив, LegoRequestTypeпотому что, если бы мы хотели их frobulateвсе, мы знали бы, что нам пришлось бы LegoModelкаждый раз передавать .
Этот нюанс со связанными типами делает любой протокол, который их использует, особенным. Стандартная библиотека Swift имеет такие протоколы, в первую очередь, Collectionили Sequence.
Чтобы позволить вам создать массив вещей, реализующих Collectionпротокол, или набор вещей, реализующих протокол последовательности, Стандартная библиотека использует технику, называемую «стирание типа», для создания типов структур AnyCollection<T>или AnySequence<T>. Технику стирания типа довольно сложно объяснить в ответе на переполнение стека, но если вы поищете в Интернете, есть много статей об этом.
Я могу порекомендовать видео Алекса Галлахера о протоколах со связанными типами (PAT) на YouTube.