Напишите условную конформность, делающую Array Summable, и объясните, что она открывает.
Протокол Summable требует один метод, combined(with:), и Int уже конформен. Сделайте Array из суммируемых элементов тоже суммируемым.
Требования:
- Добавьте конформность с условной клаузой
whereпоElement. [Int]должен получитьcombined(with:), а[UIView]не должен против него компилироваться.- Делегируйте собственному
combined(with:)каждого элемента, а не переписывайте логику.
protocol Summable {
func combined(with other: Self) -> Self
}
extension Int: Summable {
func combined(with other: Int) -> Int { self + other }
}
// расширьте Array здесь
Напишите условную конформность.
Условная конформность делает generic-тип конформным, только когда конформен его параметр — extension Array: Summable where Element: Summable. Она открывает API для [Int], но не для [UIView], ровно как [T] становится Equatable, когда таков его T.
- ✗Думают, что конформность применяется к любому типу элемента безусловно
- ✗Переписывают логику элемента вместо делегирования его конформности
- ✗Считают, что
whereна функции — это то же, что условная конформность
- →Почему
[UIView]не компилируется против этой конформности? - →Как стандартная библиотека делает
[T]Equatableэтим способом?
Конформность ограничена условием Element: Summable и делегирует поэлементно:
extension Array: Summable where Element: Summable {
func combined(with other: [Element]) -> [Element] {
zip(self, other).map { $0.combined(with: $1) }
}
}
Поскольку её ограничивает клауза where Element: Summable, [Int] бесплатно получает combined(with:), а [UIView] не конформирует и против неё не компилируется. Тело переиспользует собственный combined(with:) каждого элемента, так что новой логики не пишется. Ровно так стандартная библиотека делает [T] конформным Equatable/Hashable только когда таков T.