Припустимо, на даний момент ми коригуємо ваш протокол, щоб додати підпрограму, яка використовує відповідний тип:
public protocol RequestType: class {
associatedtype Model
var path: String { get set }
func frobulateModel(aModel: Model)
}
І Свіфт мав дозволити вам створити масив RequestTypeтак, як вам хочеться. Я міг би передати масив цих типів запитів у функцію:
func handleQueueOfRequests(queue: [RequestType]) {
for request in queue {
request.frobulateModel()
}
}
Я доходжу до того, що хочу все це обговорити, але мені потрібно знати, який аргумент передавати у дзвінок. Деякі з моїх RequestTypeорганізацій могли прийняти a LegoModel, деякі могли взяти a PlasticModel, а інші могли прийняти a PeanutButterAndPeepsModel. Swift не задоволений двозначністю, тому він не дозволить вам оголосити змінну протоколу, який має асоційований тип.
У той же час має сенс, наприклад, створити масив, RequestTypeколи ми ЗНАЄМО, що всі вони використовують LegoModel. Це здається розумним, і воно є, але вам потрібен певний спосіб це висловити.
Одним із способів це є створення класу (або структури, або переліку), який пов'язує реальний тип з абстрактним ім'ям типу Модель:
class LegoRequestType: RequestType {
typealias Model = LegoModel
}
Зараз цілком розумно оголосити масив, LegoRequestTypeтому що якщо б ми хотіли, щоб frobulateусі вони знали, що ми повинні були би LegoModelкожного разу пройти .
Цей нюанс для асоційованих типів робить будь-який протокол, який їх використовує, особливим. Стандартна бібліотека Swift має такі протоколи, як це, Collectionабо Sequence.
Щоб дозволити вам створити масив речей, що реалізують Collectionпротокол, або набір речей, що реалізують протокол послідовностей, Стандартна бібліотека використовує техніку, яка називається "стирання типів" для створення типів структури AnyCollection<T>або AnySequence<T>. Техніку стирання типів досить складно пояснити у відповіді на переповнення стека, але якщо ви шукаєте в Інтернеті, є багато статей про це.
Я можу порекомендувати відео від Алекса Галлахера про протоколи з асоційованими типами (PAT) на YouTube.