Припустимо, на даний момент ми коригуємо ваш протокол, щоб додати підпрограму, яка використовує відповідний тип:
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.