Associated types — это типы-заполнители в определении протокола. Вместо того чтобы указать конкретный тип заранее, тип, который соответствует протоколу, определяет, каким будет фактический тип. Это позволяет протоколам выражать универсальное поведение без использования традиционного синтаксиса generics.
protocol Container {
associatedtype Item
var items: [Item] { get }
mutating func add(_ item: Item)
}
struct NumberBox: Container {
var items: [Int] = []
mutating func add(_ item: Int) {
items.append(item)
}
}
struct WordBox: Container {
var items: [String] = []
mutating func add(_ item: String) {
items.append(item)
}
}
Здесь Item — это associated type. NumberBox разрешает его как Int, а WordBox разрешает его как String. Один и тот же протокол управляет обеими реализациями.
Associated types делают протоколы универсальными по своей сути — протокол определяет структуру поведения, а каждый тип, который его реализует, подставляет конкретные типы, которые при этом используются. Встроенный протокол Collection в Swift использует этот же паттерн с associatedtype Element для поддержки массивов, множеств, словарей и многого другого под единым интерфейсом.
Associated types в протоколах Swift позволяют типам, которые их реализуют, определять конкретные типы для параметров-заполнителей, определённых в протоколе.
Новый — ещё не проверен сообществом
Вы