Предположим, на данный момент мы настраиваем ваш протокол, чтобы добавить процедуру, которая использует связанный тип:
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.